请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:
1 d" p- t7 M: b- W9 e% F' z3 `2 u X2 I <Persons>/ [. d# p6 o3 l0 S& Y# O0 x2 t
<Person ID="1">' O2 c$ E N! F8 o! W! K& O+ q
<name>周星星</name>2 }) ~: G* y, M$ X8 `, g. n
<age>20</age>
3 c& y! Y7 ]% G$ h </Person>1 J9 i% }+ } L @! ?( c1 V# v. B- w
<Person ID="2"> S, l r) K9 I, R7 e
<name>白晶晶</name>4 N3 S' T2 D( b5 ?& h1 B
<age>18</age>- }, E0 F0 j6 V( k ]# N! _
</Person>
# ^8 p( [+ v; y& g" b& D2 o </Persons>
& Y2 g2 f( i2 W% F+ U4 I9 e5 _, D; d5 Q
在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文件:# N. L2 T- r' B# ~& l, _6 f# m$ m+ ~ J
<Persons>
2 X- c- M0 p: a" w6 T, i8 p <Person ID="1">
! I! j! V! F* b4 R$ N. ^5 F <name>phinecos</name>
- L0 C( ^* K+ K Z t <age>22</age>& h. w( |# N$ ?) h/ X
</Person>
6 h' r( ~/ L/ `2 U4 x }. W8 w</Persons>2 g% c9 m! Y, n7 I
! \/ g4 B( y' I. |" a; Q& G读写XML文件的程序代码:
+ s6 m2 A! K( \- [3 n) y& N F #include <iostream>4 I( i$ t+ E2 L
#include "tinyxml.h"
. M. i7 u& t0 y2 ?! c; F#include "tinystr.h"
1 [+ N6 h7 F9 m* M. Y#include <string>- q% p1 z9 m- h" \, T9 B k' }
#include <windows.h># \+ Z7 f3 {) Q- b/ W0 J
#include <atlstr.h>6 q+ G. u3 ~! C, \
using namespace std;5 D6 `1 h5 m; K. l2 {
% c; n1 B9 x" G4 @8 j& S
CString GetAppPath(): R$ J7 E' P0 Z" `1 \$ c
{//获取应用程序根目录8 n) k9 ?# S c" }7 n
TCHAR modulePath[MAX_PATH];1 ^2 `6 V8 j9 V! f
GetModuleFileName(NULL, modulePath, MAX_PATH);
/ A/ _/ e) {" C: J: g7 z+ B; M7 } CString strModulePath(modulePath);
1 N6 r- j. f0 G# K4 ]# Q4 a0 S strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));5 X' x; v: B+ f% m4 k
return strModulePath;$ L" }! |4 w# \+ s
}
. F0 J# L2 z; W* Y
6 l" A0 w l/ v$ pbool CreateXmlFile(string& szFileName)0 B `' w$ V5 y) O \% ]7 [
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
: L- N6 o- B7 V* v$ j5 G8 i try
! f) v8 e0 P9 U/ h: H G# m {' s" `! q2 _( e' D4 E# Y! O
//创建一个XML的文档对象。
4 i. R6 M! u" ~/ D TiXmlDocument *myDocument = new TiXmlDocument(); Y1 p5 ?2 J$ { c1 v& X- C7 U
//创建一个根元素并连接。
, r9 s/ e8 W! ^7 h8 E( c TiXmlElement *RootElement = new TiXmlElement("Persons");9 j3 R5 O, `( `. O7 W: M' |, w
myDocument->LinkEndChild(RootElement);
; U! ^: w/ I) F( n& f5 n //创建一个Person元素并连接。: n* a8 i0 g; d8 x
TiXmlElement *PersonElement = new TiXmlElement("Person");$ K" w6 ^5 L( ]
RootElement->LinkEndChild(PersonElement);
, \+ k }4 G# o9 R/ ?( t //设置Person元素的属性。
n. J* q% ?; ^! K+ Z8 I+ _' l3 \ PersonElement->SetAttribute("ID", "1");. L8 }' W0 w) J% {* C* q |. B
//创建name元素、age元素并连接。
4 c! N& F+ t: { j TiXmlElement *NameElement = new TiXmlElement("name");
2 u {8 u }8 [8 ^ O' N TiXmlElement *AgeElement = new TiXmlElement("age");
2 r9 F1 M' k6 A7 H# g9 Y5 b PersonElement->LinkEndChild(NameElement);
) b- t: X* s9 G3 z& V+ J PersonElement->LinkEndChild(AgeElement);8 b; b7 V' h7 y3 k
//设置name元素和age元素的内容并连接。- Z" ^9 ^( E7 G1 @6 k7 a
TiXmlText *NameContent = new TiXmlText("周星星");
/ T6 Y I; _# |" E) ` TiXmlText *AgeContent = new TiXmlText("22");5 g! s3 h: c. u: G F% s
NameElement->LinkEndChild(NameContent);
: K& u0 K0 N' y( N+ m AgeElement->LinkEndChild(AgeContent);
" [3 e7 s5 ~. | CString appPath = GetAppPath();
# _/ V6 `. u% j string seperator = "\\";2 Y8 j' t" P) k* P- L: {( m
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
# f% R1 i% j* S+ ^/ H myDocument->SaveFile(fullPath.c_str());//保存到文件4 D% r7 c* B( i: B
}; a$ @/ Q* T, A4 P
catch (string& e)' F! R1 R, t6 W( P7 O
{
3 z# R2 d# ^% _( \- g; F return false;
) G& X7 }; z+ h }
: N4 h( \ L6 h J* R return true;
4 L4 f& q9 ~* d/ o+ k2 F) Y4 D& H}% V, ], H$ y' X/ r6 [
9 W# r0 a; G# \- @
bool ReadXmlFile(string& szFileName). r& E/ U* {8 q" r8 N6 T, n3 ^
{//读取Xml文件,并遍历
C/ k: n8 F! q- W try' S2 P5 u" S& o' o% t
{
9 T3 P# \2 J1 w' e6 z3 B. ^" ?! S CString appPath = GetAppPath();
3 F3 J6 d/ Q5 ]( \4 r( c string seperator = "\\";
: ^% k, o2 [$ l: A string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
9 R1 v! U" g% q //创建一个XML的文档对象。
. k+ D/ R5 t- f9 g1 c% m2 b8 ~ TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());& X _0 G+ P: ^9 O
myDocument->LoadFile();
$ Z9 N g4 F; x# I) `7 q \/ F //获得根元素,即Persons。
4 |3 ~. J7 s; Q% D TiXmlElement *RootElement = myDocument->RootElement();/ ^/ v s$ z1 p% \ x
//输出根元素名称,即输出Persons。
9 n& k6 m5 U! m3 Y5 B cout << RootElement->Value() << endl;: O4 J1 g/ s. [- Y F! L+ n
//获得第一个Person节点。" b% m- [' d& q9 i# u
TiXmlElement *FirstPerson = RootElement->FirstChildElement();8 V4 X q, b: L" @# J: }
//获得第一个Person的name节点和age节点和ID属性。
5 L9 R. z/ _, P! Q( t5 S TiXmlElement *NameElement = FirstPerson->FirstChildElement();
6 O- N, G1 _/ y( ^" F1 P W" m8 T& Y TiXmlElement *AgeElement = NameElement->NextSiblingElement();
) D( r% J) c; k5 v1 H TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
% z2 G6 ]9 @6 H- j //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
0 z6 O3 v4 h* z( D cout << NameElement->FirstChild()->Value() << endl;
0 c) ?; c, ?1 o cout << AgeElement->FirstChild()->Value() << endl;: U& d8 x8 Q5 A, a# U c
cout << IDAttribute->Value()<< endl;" w+ W' A+ d7 D
}7 L2 `+ S7 r0 z6 X% j: p
catch (string& e)) M, H# _# K2 a0 `- W2 H& F- n
{4 F% [7 n/ e6 N6 q& H8 E$ N4 ^
return false;6 p2 G- W0 O( G
}1 X) |8 i* d [
return true;7 ?* u& p3 w y+ ~
}
5 V/ t" W$ H% C& R) [int main()- [$ W0 Z$ m! q8 ~! z5 S" i5 x
{
% o7 z8 A$ Y7 `3 j# @ string fileName = "info.xml";. _; G# z7 H8 \; d' j! s
CreateXmlFile(fileName);7 Y {$ L, F; u
ReadXmlFile(fileName);
( d( |/ S+ j: U. _}0 h/ W- F6 u+ \4 b/ r2 x4 `8 M
/ Y+ }& A4 j) U. i% g5 C4 c
7 p% `7 O a4 w% b+ g4 i |