请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:1 X; k, W) c* H! K8 z1 f
<Persons>' N9 o% m6 e+ ?- d/ h o: ^
<Person ID="1">6 P1 v3 K" O: T _ L% E" n
<name>周星星</name>
. V1 [! L' ?" O% ]6 |. m <age>20</age>
8 N3 { M+ j c& G1 b; M </Person>
" J7 R2 t1 H4 p7 _& p; Q4 X3 B7 { <Person ID="2">
/ S% N( L2 [* ^6 g! X <name>白晶晶</name>
0 K' {& ^" g/ E3 V! M <age>18</age>
, o) y2 `: ]/ r z4 y </Person>( A8 l2 x: ?: j& k5 ]- o
</Persons>
: M) B4 C q( A: Y7 ?
; j# }& H/ l" W n 在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文件:
Z" p4 O: ?& s8 n& e5 T% |4 b7 g( ]! l, o0 S: U& B. L
登录/注册后可看大图 <Persons>4 M- q* w# U9 P8 Q# X& u* u
<Person ID="1">
4 v" S; m8 h O! }& O3 n <name>phinecos</name>2 F9 S" D. o3 J- |9 E8 e/ p
<age>22</age>6 G& g2 A! m3 J; O9 v
</Person>
; w' {; x" w- N1 U</Persons>
" }; i5 K0 a: x: A4 h8 \0 X& \2 C2 p3 H& i/ U, I& L
读写XML文件的程序代码:
: w y L) t) _ #include <iostream># K4 G1 k# }3 v* Q' K; g
#include "tinyxml.h"
H( B9 g6 ~4 f3 H: N: ]/ u#include "tinystr.h"
" ]/ t) v! G7 |% }#include <string>: G+ R3 G# H G/ v* P
2 X$ i. Z; [5 M/ g+ M: R1 f) l5 }; G& Q5 i
登录/注册后可看大图 #include <windows.h>* }7 R" z2 j6 i+ `$ `8 u
#include <atlstr.h>7 ]1 C2 f6 N( Y, G2 t3 `& i
using namespace std; [- ^% J/ P3 H C4 a
' W( K- T' N! t$ C4 C# r/ f
CString GetAppPath()
. E/ z1 S h* W: R$ h{//获取应用程序根目录4 c+ [3 F3 Z% w B1 e8 }. {
TCHAR modulePath[MAX_PATH];
2 C7 e8 t s! `* } M1 V GetModuleFileName(NULL, modulePath, MAX_PATH);
& ^ t9 n4 C$ S9 \( F CString strModulePath(modulePath);
$ R( m5 F1 A J: E3 g* S! y strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));9 R! D' }( B3 V. p
return strModulePath;
& `- f; ?& x2 o}
$ M" t) f5 ? [. F n7 B+ [7 q2 w, p- V! H1 y$ j# @
bool CreateXmlFile(string& szFileName)$ N C, [3 I3 f/ S" p' j
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
4 t3 a6 |8 G3 L2 G* C* ]) | try
+ p! t6 `+ l7 G8 U R {! K+ a! I$ l$ d' z2 t
//创建一个XML的文档对象。
, `! G1 h/ s( S, n% y TiXmlDocument *myDocument = new TiXmlDocument();
" l2 V0 @5 }! u5 W //创建一个根元素并连接。
* n8 [! w s& T TiXmlElement *RootElement = new TiXmlElement("Persons");
5 H* k# d4 e: P* D+ o myDocument->LinkEndChild(RootElement);
7 B3 J6 L. O# R6 g n //创建一个Person元素并连接。: J5 l5 T7 {9 Z7 Y8 g% X
TiXmlElement *PersonElement = new TiXmlElement("Person");
4 y9 K& f! c; b- o5 o$ |7 S( ? RootElement->LinkEndChild(PersonElement);
( c9 _& q2 `' b8 j6 s, t! H5 k //设置Person元素的属性。
0 i' u! y e$ F4 f PersonElement->SetAttribute("ID", "1");1 @: Z% b+ f$ ]) B- U
//创建name元素、age元素并连接。
! G0 ~5 \& D9 a# q+ } TiXmlElement *NameElement = new TiXmlElement("name");9 e7 C0 H# i/ o# q4 `# i
TiXmlElement *AgeElement = new TiXmlElement("age");# t* U2 g( w6 g) W7 X
PersonElement->LinkEndChild(NameElement);+ r+ ^# x2 s( j
PersonElement->LinkEndChild(AgeElement);% {# [4 }5 [* _7 v7 U" E& g
//设置name元素和age元素的内容并连接。+ J" T: |) a9 b: D
TiXmlText *NameContent = new TiXmlText("周星星");
: J' T( F! J) f- L+ p2 u TiXmlText *AgeContent = new TiXmlText("22");. f% _; J5 g! n! W+ L, h
NameElement->LinkEndChild(NameContent);7 v! a3 O( j {0 f" f5 P- B
AgeElement->LinkEndChild(AgeContent); u+ W9 J. @ Z7 ^$ M& h3 L
CString appPath = GetAppPath();
! N$ f( A! z0 t, K9 ^ string seperator = "\\";
6 s" G+ q# E$ ?, k! ]% F/ [- Q string fullPath = appPath.GetBuffer(0) +seperator+szFileName;$ F5 c9 J6 Q- f( |8 }
myDocument->SaveFile(fullPath.c_str());//保存到文件
6 U! x* y% r1 H* j# n; w8 ] }
2 W2 {" n) `5 M. a catch (string& e)+ h2 }' u- M/ B
{3 ]. y" E' W/ T
return false;; W, i" p0 Y1 u. o
}% ~! I% M7 n& F7 |8 S( U. ?, I
return true;
. a4 Y, K; m- } P}
7 K4 ^' ?* Z7 P @( ]) B; z* G& Y
bool ReadXmlFile(string& szFileName)
* n& V- U6 }9 V' N5 E" y% }{//读取Xml文件,并遍历
. d9 s4 m9 G$ ~& ~! [% H! I try
4 i% _& r( X( ]/ x9 f0 T3 y { P# f$ W8 x# a) e8 c
CString appPath = GetAppPath();8 ?# f+ j. M( \! x8 _$ Y
string seperator = "\\";
' \6 W0 q9 `- ]& q. r/ e string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
& u! s- t1 ]; a. T6 M7 k //创建一个XML的文档对象。3 ~/ o0 G6 Z% e" c; t* [0 ?, g R: e
TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());6 z; s, [& W7 V- } d7 N) l
myDocument->LoadFile();7 z& T0 }- J# i9 W* S- n6 Z
//获得根元素,即Persons。4 ^, i! r) l: Y5 i! j) a
TiXmlElement *RootElement = myDocument->RootElement();
8 f. S$ @. \$ T* V+ O, m' Q //输出根元素名称,即输出Persons。
& Z5 ^! Z8 Q# B7 Z% S7 D" x& q9 U% b* W4 |5 v# {# ?( k8 A4 M0 j
登录/注册后可看大图 cout << RootElement->Value() << endl;
" _( m# C# f1 h //获得第一个Person节点。) F/ z. e1 P+ ]9 S# h/ N
TiXmlElement *FirstPerson = RootElement->FirstChildElement();
8 g- V! m7 j% Z4 J/ G1 _ //获得第一个Person的name节点和age节点和ID属性。* f8 B5 [: t% g* Y, b3 C- W* \
TiXmlElement *NameElement = FirstPerson->FirstChildElement();3 s% o5 B g! a4 u! a! l# B0 w( N( ?
TiXmlElement *AgeElement = NameElement->NextSiblingElement();
9 n2 M; M0 b. p3 ~$ Y* D: z TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
# I/ o w$ `: j y8 Y) C4 \ //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
% M, D$ P/ K) L+ n cout << NameElement->FirstChild()->Value() << endl;) x) E+ x5 G* w& Q
cout << AgeElement->FirstChild()->Value() << endl;
" M. F, I9 G# g6 N( |3 y, B' S cout << IDAttribute->Value()<< endl;
* Y: |& M. [& S; A1 t }6 _' ^( f& p# i, z
catch (string& e)
4 x4 e4 C3 Z) l$ s& F {# N3 o, q7 t4 _4 |7 P
return false;
; j( `0 V& }. c, E: n }
5 A: @. o, T# ?' ^$ [ return true;
/ a; t/ e1 G, Q6 ?9 S) I- Z, h}
8 S, f5 q- }6 d% @4 s1 P$ Lint main()( c) v& L6 r6 }4 A/ \; }- |
{
% B0 y+ [ l a4 r3 ]5 ` string fileName = "info.xml";
6 H: h7 k: {5 ~0 s6 J# J* R6 ^# r" Q CreateXmlFile(fileName);
" m& Z- ~8 V- {/ O+ `) U& w ReadXmlFile(fileName);
6 @; N( w! o! Y$ B- s; g7 p ^4 }4 t}
; N2 a' t! X9 P. [- A
2 j5 ]) ?' X3 }" o ?9 i$ k8 C" |3 H3 w0 q0 v+ _. m, }
|