请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:: x! ?0 @; @( S; \4 i' y+ w6 s- T
<Persons>2 v& J A7 U6 V8 s( s3 c
<Person ID="1">* ], A0 K9 ~( ^4 h* [% \
<name>周星星</name>
0 I( G1 ]7 t" c5 N3 Q+ b; U: Z7 f/ @ <age>20</age>7 y) m2 @2 s* f
</Person>
; \; j7 \+ a1 y9 ^4 x <Person ID="2">
! u, l' k2 r6 K0 { <name>白晶晶</name> I! ]; J9 ^! m" e2 m
<age>18</age>
( `/ O; \" v% I% Y. L </Person>
5 F/ D3 D+ e$ b4 d' ] </Persons>& H6 K, C+ ?; J! N
+ b+ h/ Y. \. B6 ^6 L# [
在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文件: A% ~* l6 R% b, L' b$ J# n1 Z+ E
<Persons>
( T& U8 q6 {8 R5 k; V <Person ID="1">
u4 A7 o0 L# k9 L# O* J" f <name>phinecos</name>
4 `& B" _% j! h <age>22</age>
) o2 e5 Y# P1 j5 r: A </Person>
& Y' [' U& V1 s</Persons>
- j# h2 M6 J; R2 i4 }3 n M+ y9 A5 L. j; j% a
读写XML文件的程序代码:8 _$ }$ U; s0 k' p5 {+ T. s
#include <iostream>
4 @8 c' u M0 n& V#include "tinyxml.h"
0 o4 D- b& m- g7 `5 ^" ~#include "tinystr.h"
' y9 r0 z0 m( ]$ @#include <string>
' v8 g' t( n+ H0 K+ e#include <windows.h>- [2 J9 N2 X$ B' |$ _
#include <atlstr.h> I( R" R# m4 S- o2 o/ {2 s
using namespace std;( `: z. n- u1 m
" H2 j( ^" _% t: i. w
CString GetAppPath()9 [& |( J. d) |+ a
{//获取应用程序根目录
" ]! F8 J1 J3 B1 m TCHAR modulePath[MAX_PATH];. F) m# f4 a1 V! o7 _; r4 Y2 g
GetModuleFileName(NULL, modulePath, MAX_PATH);' Q5 p" Q/ V2 y$ n' ]7 X/ ^
CString strModulePath(modulePath);) a) m* a1 B1 _8 B5 R: b
strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));4 J7 [$ F5 [7 l7 G3 C+ x
return strModulePath;: I; N7 x- V9 i4 s
}) f# `# y, b, ^9 A* i! T5 a! R
) {7 u* ?: U* W. f9 J3 }bool CreateXmlFile(string& szFileName)
* a+ M u/ K4 \& K" J( L* p{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false0 V( s1 {/ f5 D* N5 y: v
try3 Q8 X9 c( H; u2 r
{7 m, y4 v, y5 _' O0 b2 }
//创建一个XML的文档对象。
; t S# |% Y) M$ {/ `1 V TiXmlDocument *myDocument = new TiXmlDocument();
( U1 s2 M1 n$ `+ J. x# ~! e( z+ u/ R //创建一个根元素并连接。- G* g) j7 h+ n# X: q0 V# M- D
TiXmlElement *RootElement = new TiXmlElement("Persons");& j: q& E i0 O. H o( _, r- H! @
myDocument->LinkEndChild(RootElement);
5 m% L4 d) G [+ D, L //创建一个Person元素并连接。
+ N. C8 P, w* E. u. _1 @ TiXmlElement *PersonElement = new TiXmlElement("Person");2 m9 O9 M; r' j' _& ?! e
RootElement->LinkEndChild(PersonElement);3 N) e: U/ y2 j
//设置Person元素的属性。
. j+ B% S& r+ A6 r PersonElement->SetAttribute("ID", "1");
8 [4 Y7 M; i5 `6 m //创建name元素、age元素并连接。
6 T/ u+ Y( O" h" c2 }9 o' m TiXmlElement *NameElement = new TiXmlElement("name");
+ c) M l' f7 s$ e( N) V TiXmlElement *AgeElement = new TiXmlElement("age");
6 z* x; _' H; R2 z2 U( v' O* L! b PersonElement->LinkEndChild(NameElement);. x _4 q3 s8 z% i
PersonElement->LinkEndChild(AgeElement);; }0 u4 r( d/ W; w" g
//设置name元素和age元素的内容并连接。
?2 f1 \+ l! `/ f) ~, y7 h5 ] TiXmlText *NameContent = new TiXmlText("周星星");
6 ^, R. A( d, z2 l: Z) I TiXmlText *AgeContent = new TiXmlText("22");0 L: B) c2 p, U, B. U
NameElement->LinkEndChild(NameContent);/ \) j, P$ H5 J
AgeElement->LinkEndChild(AgeContent);
% D8 A6 T9 `% A+ \# {8 h9 W CString appPath = GetAppPath();: W% t" r1 b; C" I# j! a
string seperator = "\\";
/ }% m/ }+ {9 t# ^4 \' I string fullPath = appPath.GetBuffer(0) +seperator+szFileName;! j: U0 y% Y Q" [
myDocument->SaveFile(fullPath.c_str());//保存到文件0 U$ n" m9 r7 z# \
}
\+ }) w" d, g# t B/ y" ] catch (string& e)
- g7 X& i+ v+ D, l6 u {* p& q5 K% M0 d5 p
return false;
h1 |& g6 ?2 T6 N }
9 ~* X! [6 T) ^* F* k return true;
' c" N& E7 q% J}
7 [/ {1 v- C3 J6 H
& @! m% m) c8 t7 cbool ReadXmlFile(string& szFileName)
6 u. `; y% |" O4 O{//读取Xml文件,并遍历
: J0 Z" X' @4 ~ x try; W8 D* h' s# a9 N% m. J
{* {- _4 o. ~. P8 ~$ D9 }. X
CString appPath = GetAppPath();1 |) ^% a7 ?5 W8 j) b% E
string seperator = "\\";
8 u: N8 j: I7 z: d- N+ D R string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
3 K6 n* Y7 c4 L+ p: X3 h //创建一个XML的文档对象。
' Q, p7 x' y: T# V6 @7 r TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
9 u V4 ?6 W. f7 t d! ~: D' G myDocument->LoadFile();) v& d, @" R7 _
//获得根元素,即Persons。2 @, m: Z) U5 ^9 Q1 h, j: Y" |
TiXmlElement *RootElement = myDocument->RootElement();$ c5 j- Y/ _* C! K* j( F
//输出根元素名称,即输出Persons。+ B: ^& f4 n2 C+ l
cout << RootElement->Value() << endl;: l, Q& q1 b9 I% C: l, B/ D! \
//获得第一个Person节点。$ I% P7 ^2 ^- P$ |/ G
TiXmlElement *FirstPerson = RootElement->FirstChildElement();6 q+ r& n8 e9 K5 X8 d$ g8 H7 K/ ^8 u
//获得第一个Person的name节点和age节点和ID属性。
: H$ V4 q& V; ^ TiXmlElement *NameElement = FirstPerson->FirstChildElement();, G1 `6 F/ M s# o; P3 l
TiXmlElement *AgeElement = NameElement->NextSiblingElement();
- M7 Z% b$ [/ @/ ^+ j4 h TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
; }' x, e9 ]' a" s7 R //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。2 v5 S& T7 S0 `" x' \- m- j6 o
cout << NameElement->FirstChild()->Value() << endl;
. E# q% W i9 O# } cout << AgeElement->FirstChild()->Value() << endl; M5 ^9 ^, j9 r
cout << IDAttribute->Value()<< endl;! ?( Q7 ?6 u. ^& N f$ e
}( N; ~9 t6 _* V0 S! O
catch (string& e)
1 V+ `7 {: f) H, y; J* E# i% O {
' j: B+ ~+ D x% c! Y* E# z+ b: r/ Q: ~ return false;
! W$ `( X3 }' n& y5 W }# L" {3 G5 Z2 `# X0 H/ _! _2 n+ h8 }
return true;
, O7 J: r; q3 p o$ y}
# x) X- M6 F$ I, [int main()+ A- x, }, Q7 d' z" r
{; R9 {3 b3 O6 g; L5 H; k) w
string fileName = "info.xml";. c9 M& B# N" y$ P
CreateXmlFile(fileName);
5 o! }* C Q7 U( ?* c& D- R, E ReadXmlFile(fileName);
' f4 R1 |) f" Q; l9 L}
7 q- `" E& e! i% I5 k1 k& ]( ]" W4 }$ ]- }
- Q/ {4 ]$ K( x; z& ]( f) J |