请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:3 w* E( _ x& c
<Persons>: B) K2 P5 C3 q1 p8 b+ y
<Person ID="1">
, G% f% w- u0 W( x# ^ <name>周星星</name>
) y' z' k Q7 e8 T0 l* \; [ <age>20</age>; m( q3 R+ y% l5 z9 A9 M* I
</Person>4 r$ M e9 c r' U, F% F
<Person ID="2">+ F2 C* ]; z! Z9 f9 s& B3 Z+ |" k
<name>白晶晶</name> F6 V4 b* D! ]1 r
<age>18</age>5 o+ v( N, G% C8 E8 S
</Person>
) M" F: n& n/ J0 J: O6 q </Persons>
- c! P( p1 a3 _! l" B+ y; I/ p) O! o- c$ }: y4 U6 Y
在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文件:- p$ e0 L1 A+ u. D( `4 A, J: O; J0 O
<Persons>
$ R8 w6 }' P9 C' R% W# g: } <Person ID="1">% u- P; B9 Q7 Z B( Q0 L
<name>phinecos</name>8 }% N @. E. ?6 B
<age>22</age>' u9 c. v0 S4 j# H2 Z
</Person>, T, `4 N( m0 Y4 l/ N* J
</Persons>
1 U% r! r J! U1 [. W* H! X
; K# v% g3 @4 D, t+ A: W$ m; U读写XML文件的程序代码:0 Z$ _$ F h- ?" D0 b
#include <iostream>/ v* O% q! W8 M( I. @6 z
#include "tinyxml.h"+ {; `. z+ w$ M* B. X# k
#include "tinystr.h"
8 a3 h" ]9 C1 U# W; v; z#include <string>, ^+ f. x: b) P8 U' u) b6 ?* C9 t
#include <windows.h>
3 x+ [8 R; ^! V+ h#include <atlstr.h>
% z! k, J) W/ f7 l" |using namespace std;
4 `! a. r0 o4 p; O9 q* t4 Z7 H
- w: t) ^8 o) l3 J' W7 |2 S1 @CString GetAppPath()
8 F5 l/ e2 [, ]3 V{//获取应用程序根目录: Z; g' o& H8 ~( ?4 @% j D
TCHAR modulePath[MAX_PATH];
4 i* j6 a g' c' }. B! Y GetModuleFileName(NULL, modulePath, MAX_PATH);1 C ]4 @' o; v( v9 \' G0 u
CString strModulePath(modulePath);
[0 e4 y3 T: k; s' L strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
5 H8 u9 v6 i( R$ I! u, p" M$ w return strModulePath;
/ H' A2 a" z1 K3 W/ J}" w. T0 t% N" z8 {9 G2 W
5 R9 b# l& M3 `9 A" ~, abool CreateXmlFile(string& szFileName)/ C. _ e- t s; T
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false" }' e6 H) g. G
try+ W4 u6 f# `3 D8 F3 ^- B; q& }. L7 z
{
" `/ l( \9 k( Y" n+ U2 t2 D //创建一个XML的文档对象。' b: A, o8 L4 F4 w1 Z
TiXmlDocument *myDocument = new TiXmlDocument();
( z' C/ d* I: `6 v //创建一个根元素并连接。
0 B* N7 m5 ]* V8 d2 R+ b* X TiXmlElement *RootElement = new TiXmlElement("Persons");* |9 X5 X0 }- F% a! R+ x7 |
myDocument->LinkEndChild(RootElement);: b# \2 Q. `6 v2 s+ g5 J9 Q' Q
//创建一个Person元素并连接。
4 D5 P8 Q% A& v$ z! |& ^ TiXmlElement *PersonElement = new TiXmlElement("Person");5 u7 `1 _6 X3 d5 ~
RootElement->LinkEndChild(PersonElement);' I* ^9 o( w/ |5 \; Q
//设置Person元素的属性。
3 K- F6 u* Q/ J' F/ R/ s PersonElement->SetAttribute("ID", "1");
8 |! ?+ u& I4 ?0 V. {& c M7 p //创建name元素、age元素并连接。( o D4 g, u. ~* _7 e5 ]# c) k
TiXmlElement *NameElement = new TiXmlElement("name");. \1 k: L& L. @6 ~8 ]# ?2 H
TiXmlElement *AgeElement = new TiXmlElement("age");: j( X) V. d6 f
PersonElement->LinkEndChild(NameElement);
4 H- B! W1 x; n9 m/ |8 v5 {5 N0 l PersonElement->LinkEndChild(AgeElement);
0 ^- a2 C$ i, ^: Y* J //设置name元素和age元素的内容并连接。
8 a. j6 U% [) } TiXmlText *NameContent = new TiXmlText("周星星");
7 c+ Z) c9 a2 r$ t7 A7 R _ TiXmlText *AgeContent = new TiXmlText("22");
4 r1 Y( h# Y7 X+ c7 o NameElement->LinkEndChild(NameContent);
* I: H6 S. I2 e" R& w* R- z" c, P AgeElement->LinkEndChild(AgeContent);
2 y5 m$ [ N5 M2 [% A7 ] CString appPath = GetAppPath();' S p1 {9 d" T) s6 X! t T
string seperator = "\\";3 r% f# x4 W% W B. T1 H
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
6 R% D2 A4 x* A9 c myDocument->SaveFile(fullPath.c_str());//保存到文件
& B" D& w* K/ } }* j- e1 Z1 f m6 J2 r
catch (string& e)& V9 |* v( B: M/ [
{8 A1 d8 B& t) ~3 J% C. P
return false;
" z( `8 g+ B. R6 [ D/ Y }6 g: ?8 s4 X" R, c) \* p9 k
return true;3 y: U5 C% f, g. r
}2 s6 Y9 m- Z; b8 o1 f& z
& p7 r5 {8 Y' [! L" U) [bool ReadXmlFile(string& szFileName)
2 L7 r9 {, p" m/ l2 e. B+ O0 e{//读取Xml文件,并遍历1 C: C9 g7 ^( o& G! D( I8 g" @! D3 ]
try" v$ ?; f% @+ N3 r
{
- o' p* x9 L _$ h. q CString appPath = GetAppPath();
0 M" e0 s7 {4 L- I# o! O string seperator = "\\";$ @# `0 v/ a; |1 j) `
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;# \% Q2 O6 A+ J
//创建一个XML的文档对象。3 b X: y* T+ F7 h& `+ U' S$ x
TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());0 ?& \$ z6 d7 \* `: g
myDocument->LoadFile();4 L! O7 `) a! F* m
//获得根元素,即Persons。& {6 K: A2 k" W I; n
TiXmlElement *RootElement = myDocument->RootElement();
: Q6 _4 w) |2 Q4 l' v( g //输出根元素名称,即输出Persons。" v% Q( u0 A8 k% [( l4 [- U
cout << RootElement->Value() << endl;
! v7 Q. D- M9 c* _' ? //获得第一个Person节点。
2 B) U/ l2 m& ] }' Q TiXmlElement *FirstPerson = RootElement->FirstChildElement();
# o) O. x# h* p# ]# Y //获得第一个Person的name节点和age节点和ID属性。& l4 w0 [, v& O- f5 m$ J# i
TiXmlElement *NameElement = FirstPerson->FirstChildElement();) s1 C* Y6 I1 F# p9 w+ ?/ s, q: Y
TiXmlElement *AgeElement = NameElement->NextSiblingElement();* t9 X% U$ L7 L5 r5 F0 j9 x6 z
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();( Q2 ?. g+ V. |5 s* E
//输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。. h$ q, W. y7 D1 K" v
cout << NameElement->FirstChild()->Value() << endl;
% @- X( U1 a8 t. c cout << AgeElement->FirstChild()->Value() << endl;
! M" k, Z j0 B# J% [; ~* b cout << IDAttribute->Value()<< endl;& I- \7 r3 p. ^+ D1 L2 h
}
3 E& l$ t& r7 R catch (string& e)
% N- c. o: O8 ` { D* B& _/ d, z1 M3 V$ G
return false;& Y% H( e# a6 |, H
}$ m$ n( D; n- R* z
return true;- g# v$ h+ B$ d* L0 c, A
}
- d' |; o! }) `- e9 Bint main()
( \6 `' p2 i# i5 l3 r8 q{: [' W' J) V @, j
string fileName = "info.xml";
; Z: c5 `4 G. F3 o, y3 t) m CreateXmlFile(fileName);
2 ^% s G) l- ?7 l% B( u3 H, n ReadXmlFile(fileName);' `- a; Q1 Z8 i3 T- P) v$ i% L
}/ {# m) c6 k6 T8 A" J
" t# W% F) L; n: ~( j
1 P+ @, ~% O3 J' ~* f3 e' B
|