请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段: n3 p. n% h3 S* ?+ O0 ~) s
<Persons>
6 E1 k0 N) H. ]% ^, Q( M( U <Person ID="1">
1 S, K8 z! s4 z! G$ G <name>周星星</name>
( D: U7 {& j/ b' Z. L( ? <age>20</age>
! [8 n1 h* w) O% _* t7 v# d </Person>
3 |- x1 w o$ G/ [7 j: D* r <Person ID="2">
/ Z: a1 R! H! }0 a) C. d. B <name>白晶晶</name>5 Z" B) L* [! c& W# @
<age>18</age>
; l, C; }# \+ u9 h4 J) | </Person> r; H# U; O+ o$ R, a7 c: H
</Persons>3 z9 l/ _8 _9 r; F* t) U" b
3 ?6 A3 S( \' U/ W% Q. v z- n: x 在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文件:
4 X& y- S- U) ^ y<Persons>& F- @3 Q7 Y* D h. K
<Person ID="1">
f" }* H1 t* `* P <name>phinecos</name>& M7 ~. f! K& H; {9 }6 N$ Y. n5 [
<age>22</age>9 h. ~' E+ P# q
</Person>
( t C( e9 F. P: m) k3 I* v! p: b</Persons>
( r( I9 S' p, y$ w" Y9 w
: b; o9 g6 R ^3 ]0 H8 F- v读写XML文件的程序代码:% B7 W c; b3 N) s2 J8 b8 W- a9 W
#include <iostream>) c- S* V+ E/ X
#include "tinyxml.h"
8 X: y9 J4 I# {) {$ K#include "tinystr.h"! o# F3 J3 O% h3 x7 ` N* E
#include <string>1 {0 {) x, ]" }
#include <windows.h>9 x9 u9 B! V. S
#include <atlstr.h>% T& G/ ?# J; I* ^6 Z3 F% p
using namespace std;2 ~' Z9 J2 k9 T
9 U/ T4 k7 D2 t3 a6 V0 M$ _CString GetAppPath()
( o7 U6 d: \+ w* e: [( i{//获取应用程序根目录- g5 Q/ q& k3 q, }* R0 o6 X3 h
TCHAR modulePath[MAX_PATH];& U' k# [) k, [- i/ _) D( ?
GetModuleFileName(NULL, modulePath, MAX_PATH);
# E' j; R2 ?# i6 L$ O& d' [ CString strModulePath(modulePath);+ L# G4 q! d+ t% D& c
strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));% v, q( l, ^ b
return strModulePath;
3 n3 q6 x/ X7 \3 h: K5 v+ P}
9 P; q1 |' Z* O) P. G/ V6 y2 N5 S* o5 Z7 r/ l# b
bool CreateXmlFile(string& szFileName)/ L/ c$ `+ _' P. [5 I( ~
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false+ U: c7 Z- O' ?; a
try
& B& U; c7 N3 ?, b# T {
+ k1 f' b; T$ J: Q9 N+ h. _, p% c //创建一个XML的文档对象。0 r- D& I) _9 f/ i1 b
TiXmlDocument *myDocument = new TiXmlDocument();
7 V, g3 R. g: b //创建一个根元素并连接。
3 ? T4 V2 [! M- O TiXmlElement *RootElement = new TiXmlElement("Persons");; i; @/ i+ L+ Z* v; \, U
myDocument->LinkEndChild(RootElement); D- r- h" u. x( x
//创建一个Person元素并连接。: V7 C! _+ p4 E. s" d% y
TiXmlElement *PersonElement = new TiXmlElement("Person");# {: K; r q/ S& B- j2 `5 h
RootElement->LinkEndChild(PersonElement);+ ]0 P' E7 b/ |) @. K) L
//设置Person元素的属性。. t f% w( C$ j3 M* U4 L
PersonElement->SetAttribute("ID", "1");
% ?8 P# l- _9 m! u2 T //创建name元素、age元素并连接。
8 e# _' V1 A" m3 f TiXmlElement *NameElement = new TiXmlElement("name");, v+ [7 I& K U' E2 B
TiXmlElement *AgeElement = new TiXmlElement("age");
$ E+ e9 C! @" E% \0 G PersonElement->LinkEndChild(NameElement);9 v" t7 q! J; y- H6 _& R; q& \; t
PersonElement->LinkEndChild(AgeElement);
8 D0 }% W; G& F9 e" q$ l //设置name元素和age元素的内容并连接。
; A. \. {9 b8 q7 |( w. g0 S* e TiXmlText *NameContent = new TiXmlText("周星星");( l+ L7 b8 v( e7 y- M/ J
TiXmlText *AgeContent = new TiXmlText("22");
- {! C' r. Z( }3 E& g) U& x, R NameElement->LinkEndChild(NameContent);
) v. A- g; B& ?. m AgeElement->LinkEndChild(AgeContent);
; R2 v) c+ M# F7 z CString appPath = GetAppPath();; D, J, s+ o" X0 @& B' i; N
string seperator = "\\";
1 q, Q1 k$ d) l1 O string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
: D& F9 _; e' b" c( V8 J, ~ myDocument->SaveFile(fullPath.c_str());//保存到文件, {0 Y) V3 X5 i
}
" @; L0 t* R# H: `% g- Y catch (string& e)
' t4 l h! ~$ T. a: X0 d2 ]' E {
( H7 b6 C1 O9 V& J% a* g return false;
2 B' q' K4 _2 [ }
3 H7 ]5 f) x' |' e9 ^# g return true;- Z$ ` t4 P8 j! h0 Z
} M" V. f& d' m5 W4 B
2 l- t' E8 l% Y2 r4 _/ U0 `% \. sbool ReadXmlFile(string& szFileName)
( e6 v7 l; G. l/ ?{//读取Xml文件,并遍历
; g J Q/ a) k. | try
+ h. q4 h/ |6 O/ q1 H {; [9 m/ f' Y% y' O
CString appPath = GetAppPath();
& ?6 q$ G% W- f: k8 G string seperator = "\\";
+ e$ |5 S0 z) ^% E9 o" t string fullPath = appPath.GetBuffer(0) +seperator+szFileName;3 n9 h4 Z2 [ @; J8 G( H6 U G p# a
//创建一个XML的文档对象。
5 a7 Y- [, s9 _3 E% j% s TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());* H' p4 ~$ O- g) \( r) h/ z6 d
myDocument->LoadFile();
9 j0 B( F8 v2 f) G //获得根元素,即Persons。
- _7 u" x, G1 ~. A+ ~3 ~ TiXmlElement *RootElement = myDocument->RootElement();9 l5 }. o1 f2 s# B! H
//输出根元素名称,即输出Persons。
0 x& B; [/ N0 K7 y( b1 t( B cout << RootElement->Value() << endl;3 i7 H9 P; a2 x: W9 p J
//获得第一个Person节点。
2 k/ {: r. @: w% k* v TiXmlElement *FirstPerson = RootElement->FirstChildElement();
{, r2 }( m9 \0 n //获得第一个Person的name节点和age节点和ID属性。
* B3 x( P% M3 Q6 O$ t5 @ TiXmlElement *NameElement = FirstPerson->FirstChildElement();" Z, ~# K' \+ U+ f) |% {
TiXmlElement *AgeElement = NameElement->NextSiblingElement();% p) O& @ _) K; V
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();9 h9 s3 l k; l7 Q
//输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。8 z6 b4 L! a$ m: t& K; z* ]# n
cout << NameElement->FirstChild()->Value() << endl;
+ r, V1 M5 G: P" v8 y$ L: n cout << AgeElement->FirstChild()->Value() << endl;
9 J- w, ~3 Z1 C cout << IDAttribute->Value()<< endl;$ n, T; E/ X' x7 Y2 h6 K
}
T: x7 p' l0 Z) g0 Z catch (string& e)
1 _. E( i7 r6 O5 I {& ^' n$ [2 n3 k* C& m( E+ A0 P
return false;6 h) \- p& ~; c- } ?; X% _
}: T- G6 ^0 b1 P( P" @
return true;
+ h' F' a: R- y}
: ~5 @4 B* `/ ^int main()
8 A& O. N, C, ^/ a' x{. D* A0 G! Y; ^; ~/ I/ \- i$ m
string fileName = "info.xml";
9 S( p. T$ u1 z0 }9 \ CreateXmlFile(fileName);
, j+ j! F5 O7 g. _8 P0 {( y+ B, A ReadXmlFile(fileName);
" ?+ a$ L5 I6 J2 m3 i, s}6 n" R3 |: w0 s; z
& A+ @: u5 j/ O1 l3 q+ m% R" H! M8 f$ z
|