请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:
- e# B7 c, _; s" B A <Persons>! B' A; ~% p! X# h, T' q
<Person ID="1">
/ U) Y. b/ ?: { <name>周星星</name>
" w+ P* r+ k7 s% C2 y <age>20</age>
& P7 E8 h6 b6 G; Z0 i) f </Person>
7 C! f ]8 l( X/ d+ D. d <Person ID="2">+ i6 {( \! K# Y: J
<name>白晶晶</name>! N* P( f1 n1 f; h$ M: H
<age>18</age>
% a* C% ^" J4 w3 U' }( \1 i* Z </Person>$ |0 W' L$ i, [. o
</Persons>
6 [7 ]3 o1 v6 [& Y1 j1 Z; a& D6 @" q7 N- _: d+ V8 O, s2 e/ w
在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类。 TiXmlAttribute:对应于XML中的元素的属性。 TiXmlNode:对应于DOM结构中的节点。 TiXmlComment:对应于XML中的注释 TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。 TiXmlDocument:对应于XML的整个文档。 TiXmlElement:对应于XML的元素。 TiXmlText:对应于XML的文字部分 TiXmlUnknown:对应于XML的未知部分。 TiXmlHandler:定义了针对XML的一些操作。 TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。。。 对应的XML文件:- V: m9 z* B) k: E9 V
<Persons>
! n0 }% M8 X) f% h <Person ID="1">( b0 p6 j! @. j6 k4 ?, }1 }7 a
<name>phinecos</name>
9 {. M# t: d* t6 R# R0 M" I <age>22</age>0 E! A* {0 y! p) d4 o- T
</Person>. M6 u2 |! ^5 Y1 e4 t' _
</Persons>
* M6 X X' l# I4 }! i ~' \7 I: Q; Y+ I" d/ K, G* ~
读写XML文件的程序代码:
/ D8 `7 i: m' }& w4 ~5 s1 y$ w0 E #include <iostream>
. \1 V- S/ F6 I( S#include "tinyxml.h"! l; `$ L' A/ i4 B9 V+ l
#include "tinystr.h"" s: k4 `3 K6 B9 `# t
#include <string>- O# _; d- a; C5 e) i2 x0 j
#include <windows.h>; K+ r; U: T( W) ?) z
# B2 T% X( E4 w* u4 b9 r- C( G' J* A- Q 登录/注册后可看大图 #include <atlstr.h>
) B$ l# k9 ]1 D( m6 A) L n$ ousing namespace std;
2 y( n3 g P0 O* z+ [. d. p* L! t2 \2 r, |" H6 C
CString GetAppPath()
# y+ v' N( v# P+ x7 @' g% t{//获取应用程序根目录
1 N. ?; ?, V, Q/ s( c& l1 V TCHAR modulePath[MAX_PATH];
I3 A% p' K4 X } GetModuleFileName(NULL, modulePath, MAX_PATH);! W! `) }' e: ^- c& b
CString strModulePath(modulePath);
' c0 o& O& t, O8 c strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
. s! q4 ? V4 ]; v return strModulePath;# O n6 P3 b e# {, F; r: S
}
6 S" I+ x! @0 W
% e) E+ O T+ }( M5 M; r, H9 ?bool CreateXmlFile(string& szFileName) c+ @5 ^2 C9 e4 g5 E6 D: ?
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
; R: z9 @2 ?; X8 \) |) I* I3 ^ try
( I' S5 d3 R) f: q+ \ {
6 `2 H8 c4 e2 [1 ] //创建一个XML的文档对象。
) _1 Y! t+ {6 b1 f7 O, u- Q- J TiXmlDocument *myDocument = new TiXmlDocument(); R% V9 E6 X" \8 P" n- C
//创建一个根元素并连接。7 v9 F; H+ d# G9 n" T9 t& A8 r
TiXmlElement *RootElement = new TiXmlElement("Persons");
% i) e; {& j: X ) @" {+ ~1 H. o- D7 j6 M& l& k4 W4 w0 `
登录/注册后可看大图 myDocument->LinkEndChild(RootElement);
9 H7 x( n u0 g, Z7 E //创建一个Person元素并连接。# a- X7 B' p! \$ o+ d# Y
TiXmlElement *PersonElement = new TiXmlElement("Person");
% `2 h) S+ [6 ^" w- V$ ~! D+ v RootElement->LinkEndChild(PersonElement);
5 s1 v2 P. g( b2 e: H- _3 |6 ~ //设置Person元素的属性。
: c `9 n E( @9 r: v* Y' u PersonElement->SetAttribute("ID", "1");
' B# i ` F0 _# z: }! j //创建name元素、age元素并连接。% ^# ` ]! i6 d1 ^
TiXmlElement *NameElement = new TiXmlElement("name");, y) }7 T0 ~8 I! L. \/ v
TiXmlElement *AgeElement = new TiXmlElement("age");; {8 W- E: a: }* X7 m
PersonElement->LinkEndChild(NameElement);: T$ D3 q+ f4 [/ `2 ?' q7 F2 c
PersonElement->LinkEndChild(AgeElement);
' L9 V5 v' q* k //设置name元素和age元素的内容并连接。, K2 N( A: |4 R& F
TiXmlText *NameContent = new TiXmlText("周星星");+ {. m* n }- \. @0 g
TiXmlText *AgeContent = new TiXmlText("22");
0 J' d2 U3 i( Q$ g NameElement->LinkEndChild(NameContent);
$ Z5 l, Z' Z( I; @3 a" P: v! d AgeElement->LinkEndChild(AgeContent);
+ p4 D5 F3 G, a! J9 v, \ CString appPath = GetAppPath();
|: N- I/ \7 x, G8 J7 b string seperator = "\\";
: q4 M; O! x+ D& ?' n string fullPath = appPath.GetBuffer(0) +seperator+szFileName;5 J" W- ?* g; _# E" k+ p. i$ G
myDocument->SaveFile(fullPath.c_str());//保存到文件
2 [: @- R8 Q( W% c2 r( ~ }0 L4 c! Z0 g! W7 j7 ~/ G3 T5 M
catch (string& e)/ u! X1 x$ t M. ]7 @" K
{/ O: u# C8 t9 c) r: \
return false;
, Z$ G( D: Z- |/ \3 c/ g }
) ?3 A1 P4 }; P/ e7 x1 m# \ return true;
% q2 E) o' `8 F}
0 s$ {4 |! i4 M( S' j- B" ]
/ U5 n! ~; o; v# |# lbool ReadXmlFile(string& szFileName)5 K3 d) ?( s7 W! \/ m+ h
{//读取Xml文件,并遍历- q8 b" z; ^: n& u
try2 R$ o) N' i6 c$ T" h6 U
{
) L3 T4 d% u: w9 @ CString appPath = GetAppPath();$ y& J: _0 _: i5 H8 q3 v; k2 s9 {
string seperator = "\\";
2 H" u$ p9 N6 B t: q string fullPath = appPath.GetBuffer(0) +seperator+szFileName;& u5 x2 z& V8 d. J
//创建一个XML的文档对象。
) ?# `$ l9 \4 i1 L+ p TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());* K3 k* I6 D! y9 j( I* v1 i
myDocument->LoadFile();- V: d$ r: u* O* d u% k6 d
//获得根元素,即Persons。
$ z J. k. R, C1 D8 O8 I K! @ TiXmlElement *RootElement = myDocument->RootElement();
2 e; Z- Q: B( T) y& k4 H/ { //输出根元素名称,即输出Persons。. N0 |/ A9 u$ H; C) u! e
cout << RootElement->Value() << endl;
9 }/ J+ X: P* l& g$ j //获得第一个Person节点。0 X7 N) d0 m: G4 F
TiXmlElement *FirstPerson = RootElement->FirstChildElement();0 l5 t V# H8 \: {
//获得第一个Person的name节点和age节点和ID属性。0 ~, a2 |# Z/ w1 u" H% o
TiXmlElement *NameElement = FirstPerson->FirstChildElement();4 s& G$ J# S* h3 {8 @6 O- j
TiXmlElement *AgeElement = NameElement->NextSiblingElement();
( Y) }# f5 [* e. C! A TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
' d; M& n: e% q+ X) r //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。0 E0 F& s7 k+ H# ], e' k
cout << NameElement->FirstChild()->Value() << endl;
+ K% i; h4 z* l$ o' ~3 ~, E cout << AgeElement->FirstChild()->Value() << endl;6 v8 R4 J* ^3 J( c. f, I% t
cout << IDAttribute->Value()<< endl;
# I: k0 K3 d; {2 A3 e& W- s' v4 E+ y }5 r8 V/ @9 l, _6 X! d/ J; P" M
catch (string& e)( s4 }0 \" z C8 f9 @* \, e2 I
{9 I: l% e5 E9 `' o/ Y. t" k
return false;
8 W2 h2 V& e, F }
6 p4 Y) n. K `0 f1 W" L, G return true;) O: ?$ j' f% g( {5 D
}
. U- y) w; M% M% D/ v; Iint main()
# Z( |8 Z' |2 a# ~' ^{/ n# b6 v! H6 X8 ~- w' u
string fileName = "info.xml";
$ H0 B1 M7 y& J CreateXmlFile(fileName);0 B& ~; o/ d3 q: o C
ReadXmlFile(fileName);7 B& C7 g2 t3 _3 e6 P1 ^6 o. D
}/ J7 l+ Q- E$ O" N* |
: J8 O8 A* Q' L$ b
2 B' T+ k$ h& m) f: m |