请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:$ }& p) ?$ a9 o3 X
<Persons>2 ], \- Z* D4 }' I+ e
<Person ID="1">
3 n5 a! v/ B3 j6 I/ D. N- U' D <name>周星星</name>& U2 _: k) \7 D8 p; d& V
<age>20</age>, d" N" ~/ F5 Q4 G
</Person>$ i$ h7 {6 W+ x6 i0 w6 G
<Person ID="2">/ v2 @7 W) R7 C6 Q
<name>白晶晶</name> N% f, R* X7 p% {! F; _
<age>18</age>
- u$ _' b$ m8 D! b8 m </Person>
4 P* Y# j6 g; \$ B </Persons>
: K( P4 X: h& @2 P' }9 B- a* q; E5 O$ b/ Z2 ?
在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文件:
7 H8 b2 \- h2 a0 J$ r: P# ]<Persons>
}) M' l7 n: Q1 U) o# }+ h* u$ Q <Person ID="1">+ p7 J5 A3 u; X) c$ Y
<name>phinecos</name>* k3 e- p7 d2 @
<age>22</age>
' @. t+ M5 j* p9 h, q </Person>
; _6 U8 G; a$ y" V! R) }; o</Persons>
! f! d% N3 [6 F' F2 x. O/ o7 B: w: m8 }7 k! E
读写XML文件的程序代码:
1 ~1 u3 d2 c# S+ q3 G #include <iostream>, w8 o% L% x% T& N
#include "tinyxml.h" f' J" b j5 s
#include "tinystr.h"
) U, _) ] \' s+ g#include <string>
7 V; O- j9 _- T$ w5 e2 t' v" V x#include <windows.h># [' z. q$ o# X
#include <atlstr.h>( Y+ y* p8 r, ^( ]
using namespace std;
) }" `/ C- ?7 W2 m4 }& F4 b: D4 z: m( P; |! L
CString GetAppPath()( I4 p$ O* L: Y! w+ f8 k
{//获取应用程序根目录9 Q3 N: i, _+ |) t7 P4 h( q, L( \
TCHAR modulePath[MAX_PATH];, y( }$ e2 K7 s8 u! ~. d
GetModuleFileName(NULL, modulePath, MAX_PATH);. ?' h7 G- a* J( ~0 z. I
CString strModulePath(modulePath);
: a9 e+ z. R' @( D) q strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
$ q7 k. _, U4 h8 E# e1 j% k return strModulePath;
1 z/ o( i' {0 C! }1 M7 K1 m+ z5 t. D}
1 X& m/ k1 t+ X- x
) b/ V" n; W2 J, X4 S% fbool CreateXmlFile(string& szFileName)
5 ]( I3 d; |8 P# z, b8 h& f' @: \{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false- Y: n- h& m0 d. v1 x' a, [+ {
try
# k- O( ]# t' [- Q; U6 Y/ o Y
. Y/ |/ o$ Y4 }, J# W8 r3 K8 K! p. u: P 登录/注册后可看大图 {
8 p* Y0 J) U3 l. y6 \& J; F/ J //创建一个XML的文档对象。& g. X5 f% j9 G; x5 L. L8 E& W
TiXmlDocument *myDocument = new TiXmlDocument();6 W5 u+ o6 T2 [9 F" P2 v
//创建一个根元素并连接。
1 N4 F- G# N1 _ TiXmlElement *RootElement = new TiXmlElement("Persons");& T, ~2 j! T) j- L- w4 s
myDocument->LinkEndChild(RootElement);
) H& L, k+ I3 ?5 c6 D //创建一个Person元素并连接。- f i8 t% o9 A1 x# ?! e
TiXmlElement *PersonElement = new TiXmlElement("Person");
! a9 T, L% r8 y. l3 v8 q5 J0 `. q RootElement->LinkEndChild(PersonElement);) _$ S/ U: ]' x5 e. R7 F- k
//设置Person元素的属性。3 x0 n9 ]& M+ }1 F5 i: `8 o- O* |
PersonElement->SetAttribute("ID", "1");& T6 [3 {( u8 e$ Y/ I7 G! u
//创建name元素、age元素并连接。, O$ `% q. n' v# a# S, U% _
TiXmlElement *NameElement = new TiXmlElement("name");
1 C1 n2 p1 Q0 ?# r. Y* j! q TiXmlElement *AgeElement = new TiXmlElement("age");
" x0 k- Y$ k; v" h 0 r1 R2 T" J ^5 D. P5 y( y1 [. U9 b2 ?3 W
登录/注册后可看大图 PersonElement->LinkEndChild(NameElement);
4 x( [" |6 y" V0 Y7 o' Q9 x* a PersonElement->LinkEndChild(AgeElement);6 f' w; {6 H: @7 {& x& a: A
//设置name元素和age元素的内容并连接。% G; R- U7 ^' Y: v) C( V) \
TiXmlText *NameContent = new TiXmlText("周星星");
) k1 A) e7 F6 X2 h* I E TiXmlText *AgeContent = new TiXmlText("22");
2 q" a, j& f' j. A NameElement->LinkEndChild(NameContent);. ^ B8 u' P! q0 W! [1 `
AgeElement->LinkEndChild(AgeContent);3 N# R" ~, B: g- ~; Y1 c
CString appPath = GetAppPath();- z2 f V- J5 {) C+ r4 p
string seperator = "\\";
: r' H: M- H' E! p% y( g* _! a( w' M string fullPath = appPath.GetBuffer(0) +seperator+szFileName;: ^: N9 d4 Z$ j$ K$ C5 c/ `( n& I4 ^. j
myDocument->SaveFile(fullPath.c_str());//保存到文件( `' z% U0 u* {$ [
}# z- t* L7 E% j9 C' e! l
catch (string& e)
( \6 U1 b: V4 u" }9 [ {
3 h: E/ y1 S. _* X/ F4 ^0 ~ return false;
. H6 m6 l8 I; |) v" C, b6 V) a }
, r) m. g! c: G j, d8 N( R8 |3 _' t return true;
. ^: U5 p% ^2 m4 {0 d M. v: h" z' S}
+ ^7 A" P4 Y( G6 Q6 p7 k
! _9 X0 @& R7 E$ p/ K; Kbool ReadXmlFile(string& szFileName). [6 o! R2 c* M8 G2 L v$ |! {
{//读取Xml文件,并遍历) [* m2 M" P4 e) ^
try
# N; {: r3 e- T* g$ t& r) a, w {
& u1 }( ^3 M: s+ q6 w3 C CString appPath = GetAppPath();- p+ F! F! \. k
string seperator = "\\";
A! u( _! h+ h6 m. z3 u* h$ F string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
$ l; \& o5 e8 ~: o# L G% w) n9 P //创建一个XML的文档对象。2 d& s" B4 a8 I/ o& h" S
TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());1 |4 ?1 A# H4 |- A' c' z
myDocument->LoadFile();/ \( L3 R& n$ O3 ?
//获得根元素,即Persons。
$ ~& m+ W3 e, s0 _% @+ J TiXmlElement *RootElement = myDocument->RootElement();
) o2 V7 N. W" P# g //输出根元素名称,即输出Persons。* t/ V/ N5 ]( y$ M+ G' u
cout << RootElement->Value() << endl;+ Y: M5 c- B- O8 X7 m, v+ B' y! d
//获得第一个Person节点。( e: R" ^) S; K+ ~2 F/ w
TiXmlElement *FirstPerson = RootElement->FirstChildElement();
) r- ~! K& W+ X9 [( J, ]% R4 d# K //获得第一个Person的name节点和age节点和ID属性。+ u) O0 k6 M& L# w0 T* c1 ~
TiXmlElement *NameElement = FirstPerson->FirstChildElement();
7 _- t# F c4 q% U; g5 W5 b0 c TiXmlElement *AgeElement = NameElement->NextSiblingElement();% k2 I$ Q4 g4 g- {6 H, s# l
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
8 U: ]6 v' \- Q- M //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
" a4 u- R7 u' }$ f cout << NameElement->FirstChild()->Value() << endl;% k( T7 c. M* G0 _ Z a
cout << AgeElement->FirstChild()->Value() << endl;
4 z3 v& W: o1 K/ }8 J) p7 u cout << IDAttribute->Value()<< endl;
- D; P# Y4 }( ^( n9 K }1 h" H/ q, m, I5 Y0 \8 T
catch (string& e): t. ?. a- \9 [" q, @
{5 D. ?$ M- a- B: ~& t, s
return false;
/ {5 i+ y! J- ~- F* M8 [ }
j+ M; A2 o+ i) l# ~9 M+ I O& | return true;
: Z% H5 `* S8 k, e7 @, o- W}
5 G0 J$ ]* P+ o) C9 h- B) y% m7 aint main()
0 _/ }9 g$ ^" i1 a{9 _) i2 S- D' _
string fileName = "info.xml";
; |) g9 |4 V. |- G: M, m, z) }; k: v CreateXmlFile(fileName);
' A4 T* Z* s8 K! F+ m2 p/ ]4 | ReadXmlFile(fileName);& i. b- e: h9 y5 h# a3 P9 T: l
}
6 G) D9 t7 l/ j4 H" e" C- n p5 t9 Y5 ]1 d; s: j1 W' k
4 h; N: z; |% T: z( y# ?; e |