请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:' c0 w0 X; R# [0 V1 u* A* b: f
<Persons>
5 q) I) r7 @0 s& E r) ` <Person ID="1">
- Q8 j$ i/ @$ Y <name>周星星</name>
6 Z* _4 z, ~# j$ a# c5 w <age>20</age>
3 @/ z9 R5 u- ` s </Person>% Z5 d8 ~9 M$ F
<Person ID="2">$ M3 Z" Z+ t# L$ f( D) m" u: a$ [
<name>白晶晶</name>. }. I% P3 p3 N4 p0 n3 O' D( M
<age>18</age>; @3 ^5 a6 ~" t. l& Z
</Person>! n9 m5 j+ M7 z& y; F" e3 x. }
</Persons>
' k8 E$ H) o, L; z. s% P3 X+ j c
/ t) b5 E" r% f1 o8 z' W1 {8 v7 E 在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文件:0 b5 ^1 @ O \8 ]/ Q4 _
<Persons>
2 L& V8 R& M; g, o7 Y+ H, N <Person ID="1">, h; h# G- Y3 M9 u K
<name>phinecos</name>
9 Z/ ~0 _0 H4 L+ ~! S% x- F5 U <age>22</age>
5 r( {0 f" t. z$ ]) w </Person>
5 r# p( D' `* ?8 A) s" D: |# c</Persons>, A1 f- t4 V) Q/ y8 \1 j( H5 O) q# G
0 n( W6 H9 N, P+ D1 f7 B t2 A8 [. w读写XML文件的程序代码:
0 Z' V" w+ Z" R* ~1 R #include <iostream>+ @ B6 ]- A$ r
#include "tinyxml.h"
" N; G& Z7 Z) I. x. q#include "tinystr.h"
4 v, _; F/ y- c& y% b1 D#include <string>
4 Q. z( O) N+ D8 F% @, h#include <windows.h>
7 J' P2 j8 p4 _ g# M6 X# ~#include <atlstr.h>' @- Q0 R7 }( ~! X
using namespace std;8 {5 n% ~3 v; B% _ `
0 F4 j, z3 S9 UCString GetAppPath()4 l3 ]& Y+ K6 j! X7 L/ B/ Z
{//获取应用程序根目录
8 L5 r U) G8 d( I, c! [* t G) v TCHAR modulePath[MAX_PATH];
( G% e1 {+ U( D! y GetModuleFileName(NULL, modulePath, MAX_PATH);8 a: F9 h( e' ?& P7 i+ o9 ]
CString strModulePath(modulePath);
/ }: m4 d5 |3 P; c( F( P4 v, | strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
. I$ i" y, M W/ v. Z% } return strModulePath;% t1 f# I* h M4 A
}
' N. `) S" A; L: ]2 A! w% m& O& q8 C p2 y( A
bool CreateXmlFile(string& szFileName)
! H( c9 ^& X0 c! h, u7 N' ?3 d{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false, d9 M1 o7 ^. S& }9 b% T
try
; h5 S7 E. S+ Q* [ {
2 k: |1 Y2 E9 \ //创建一个XML的文档对象。
- O6 X" _/ C) v! a! n7 c TiXmlDocument *myDocument = new TiXmlDocument();$ o* c2 G/ P, n
//创建一个根元素并连接。
( @$ W; |0 F7 u$ Z- n( f( w TiXmlElement *RootElement = new TiXmlElement("Persons");
2 e& w; e0 ] M! a myDocument->LinkEndChild(RootElement);; v! Q. O6 g; V% w7 T" m" f
//创建一个Person元素并连接。- T0 j% d: v3 z! N4 S+ k* j$ ^# n9 z1 f
TiXmlElement *PersonElement = new TiXmlElement("Person");, d* Y! ?3 r5 h( U9 A
RootElement->LinkEndChild(PersonElement);3 K0 J5 U$ s! Z( Z
//设置Person元素的属性。& w, p; c* P7 n% Q# i
% }1 \& I; R% m8 D, `7 K- C9 d: P8 h# ? 登录/注册后可看大图 PersonElement->SetAttribute("ID", "1");. |: b. l$ ?3 e/ R7 U
//创建name元素、age元素并连接。' [' ?0 M' K* d" C9 _
TiXmlElement *NameElement = new TiXmlElement("name");1 r/ M& R$ G8 P9 U. I1 V: w* W
TiXmlElement *AgeElement = new TiXmlElement("age");
" |* y/ G% i0 E' ` PersonElement->LinkEndChild(NameElement);
9 W, s+ E+ G5 @) ~1 o PersonElement->LinkEndChild(AgeElement);/ M) l6 q7 U! y* M; [# u
//设置name元素和age元素的内容并连接。
0 D. K" t. _6 F: @- [, Z" T TiXmlText *NameContent = new TiXmlText("周星星");9 ~1 E8 F, ^9 u6 T0 o' B K
TiXmlText *AgeContent = new TiXmlText("22");7 q+ D5 v7 u ^ Y, W# \
NameElement->LinkEndChild(NameContent);8 M# u c9 o+ ^6 m2 D! u6 A. p% W
AgeElement->LinkEndChild(AgeContent);- [+ J& r5 N! i, i/ \: E
CString appPath = GetAppPath();+ I9 |# T2 x. O' {9 {2 n& u, b
string seperator = "\\";: C, K( o' L, Y# {. a, _
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
1 D( A8 E. o5 r% q myDocument->SaveFile(fullPath.c_str());//保存到文件+ ]0 f7 J$ \; w) W5 Y' B/ m
}, b# b& A& u; N" L
catch (string& e)% L7 T8 S5 x/ Q* f+ ]9 K! q& t
{4 o3 }4 d6 M: B8 _" O
return false;
: L) o$ E' j5 `5 J$ r9 F }
7 z$ ~, L& z* v9 ^3 a. m return true;
+ }3 Q& [, I1 }}
7 B: T" l6 m$ l7 d5 J
0 e( q- M5 ^* A+ M! ~% ]: _bool ReadXmlFile(string& szFileName)9 ]8 v& i S. B7 U2 x: ?9 M+ c/ A
{//读取Xml文件,并遍历
1 ~& s9 p, R# e, S1 @. U try4 Q7 o; `( I- O; y# f8 _
{
3 A M4 Z+ Y: X8 ?( \ CString appPath = GetAppPath();
: N6 _2 T2 I) g2 @5 I3 { string seperator = "\\";
; n, _9 X7 |$ p) V string fullPath = appPath.GetBuffer(0) +seperator+szFileName;2 I2 J9 e: E+ T# z6 }7 z" G
//创建一个XML的文档对象。9 ?2 b5 F- `4 m5 b) M
TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());) j7 h, E; G% m4 w) |0 S3 g
myDocument->LoadFile();: ~" _& g5 H9 e" C
//获得根元素,即Persons。5 V& [8 p0 l. A8 r! a* u- o
TiXmlElement *RootElement = myDocument->RootElement();
7 K6 u7 j s" g4 J* D //输出根元素名称,即输出Persons。0 j5 Q+ r( r' p& [0 U
cout << RootElement->Value() << endl;5 M, M: L8 t6 Q' h3 R
//获得第一个Person节点。
" x; q3 I* X" e# _' j* H TiXmlElement *FirstPerson = RootElement->FirstChildElement();
3 F( p. |, |/ h0 a6 j- J2 j //获得第一个Person的name节点和age节点和ID属性。 f/ g9 [) A( z
TiXmlElement *NameElement = FirstPerson->FirstChildElement(); E( L" ? ^* E/ K1 a
TiXmlElement *AgeElement = NameElement->NextSiblingElement();4 `6 A+ M1 l1 i! O) A4 J! A* D: w" V
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();: t7 h$ Y& I( e6 v
//输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
0 K9 h5 i6 q" p+ q5 z cout << NameElement->FirstChild()->Value() << endl;
; X9 e+ C! N8 @1 Y5 x cout << AgeElement->FirstChild()->Value() << endl; f% n! S4 o3 C
cout << IDAttribute->Value()<< endl;# j, y; t f3 }9 N% W+ e$ M# I
}
9 Q0 ?# H h- P5 Z1 }4 `0 z catch (string& e)' [3 d7 \/ C& m4 n% D0 }. f$ \
{
0 f2 Q2 {- v: R1 ^! R/ { return false;! V- Z. @4 {3 f9 ^$ T
}
: f) V' M& p; b' W T0 i9 e return true;, ?1 O' j# V' u+ r# K
}, \( I! C9 k3 d2 K
int main()
8 z( |: ?6 h |/ J5 g- }{
7 D& j; Y, w d1 d. s9 _ string fileName = "info.xml";
X) v! d3 F- r: `8 h3 G0 P( u! ~/ M CreateXmlFile(fileName);' Q/ o% Z0 l9 [0 m) P( L
ReadXmlFile(fileName);
+ c. u5 `& {6 S n8 \! _}
- {' K1 J2 g! ~: y2 p5 ^& e
4 f) [0 }& f, e; d, o$ \
. }$ n0 B6 K+ f% y a) e2 S( i |