请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:
/ h2 X7 o) x2 a$ ?# H <Persons>1 p! G+ Y8 w" g/ q: B9 W
<Person ID="1">
4 O/ [# b5 W/ i3 b <name>周星星</name>7 D3 r$ ~! R2 J% L' c8 S5 i, A
<age>20</age>
( x f9 S4 W6 N% f6 U </Person>
* w; ~4 w9 O& q3 A5 L$ ?1 n <Person ID="2">
$ z. p/ d2 K' f: ?+ S" Q4 B <name>白晶晶</name>7 E* V/ j: b) @0 d
<age>18</age>
1 S1 h2 p2 ]6 s </Person>
" @6 X9 s: P8 [ </Persons>
4 ?$ I3 i% V. \7 c- F0 H' L# n6 _8 J
9 S# R& W! m3 Q9 Y g 在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文件:
. ]1 ]' z* [8 E* y9 r( N: Z- u+ k) m* R<Persons>
! f' d5 [- u/ _2 ^4 J$ J1 @ <Person ID="1">1 {' _9 o l5 h1 M5 L& a
<name>phinecos</name>. g) P) \* G( ?& ~1 ?
<age>22</age>
# V8 \. |& m# I( X </Person>3 G3 `* C; P f: I
</Persons>( p' n8 L) b) }+ R3 o
8 ~. f+ x8 G: A1 o, H& t# z& x读写XML文件的程序代码:7 G" b# z2 L( I% L$ e
#include <iostream>; m- r& ]$ `! |3 |9 J) L
#include "tinyxml.h"
" h8 {' Y' @, u1 G' \+ [" ?#include "tinystr.h"
; O( ^$ @+ m! j5 l1 W' g#include <string>
" K$ `* t1 N* I7 Y1 O! j) L#include <windows.h>( H; O6 t$ I$ A8 f9 `& R m2 _
#include <atlstr.h>9 q2 g) e3 _% { g- Q
using namespace std;
6 n) V: O m% g! _0 g e! @! Z3 w, _: |4 j. u9 N# W
CString GetAppPath()9 l2 F4 Y( W5 G4 a6 v
{//获取应用程序根目录
3 q0 f9 I# K5 G6 F. c1 a" W TCHAR modulePath[MAX_PATH];" Z5 F& A6 i0 T( l" R, k. Z
GetModuleFileName(NULL, modulePath, MAX_PATH);
" \0 Q8 O. ?$ ^% N6 ]6 z CString strModulePath(modulePath);7 ?) X: U3 ?) M+ n6 H2 Z: o
strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
5 k1 k5 G# N0 X. w( L- R* J return strModulePath;) Q u+ e& [* s4 ~8 B- A! l0 q
}
7 t! J" t3 u; {7 ]! e2 \" f7 W/ G; `
bool CreateXmlFile(string& szFileName)& j4 @$ K+ c, o/ {7 h/ d
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false; m' y: H8 H1 M4 g5 B8 m& ^ J$ d
try
9 w9 M) i# Q7 K& @ Y {
0 q! |: n W3 @5 t* C //创建一个XML的文档对象。
& B) u/ @. q! G TiXmlDocument *myDocument = new TiXmlDocument();
/ N* t0 y3 r5 c; U) Z1 ~% w) S9 {0 A; a //创建一个根元素并连接。1 H( }4 V' n/ Z2 O2 g4 i( H: A
TiXmlElement *RootElement = new TiXmlElement("Persons");7 T, c, f: } v9 D* O4 ?
myDocument->LinkEndChild(RootElement);
" R0 H ?. J3 ` //创建一个Person元素并连接。7 b) `/ n4 Z" A* }$ d
TiXmlElement *PersonElement = new TiXmlElement("Person");2 }" D0 r: [- B7 T
RootElement->LinkEndChild(PersonElement);
! |6 L3 ~; _; a //设置Person元素的属性。8 w+ ^! R# S+ F1 q( p& J
PersonElement->SetAttribute("ID", "1");# v) A9 F, e K/ I j" ~! `
//创建name元素、age元素并连接。
0 `0 ], `0 I( l/ L) c2 r7 H# |9 U TiXmlElement *NameElement = new TiXmlElement("name");3 |0 \2 [+ Z% T9 D
TiXmlElement *AgeElement = new TiXmlElement("age");0 f5 j; E/ G7 W' n: V% ^+ m* U
PersonElement->LinkEndChild(NameElement);) K' q7 \4 C$ U; H
PersonElement->LinkEndChild(AgeElement);
9 a! D! v; H9 p; l8 F6 c4 [ //设置name元素和age元素的内容并连接。
: |, m0 e. H5 V; y6 | a TiXmlText *NameContent = new TiXmlText("周星星");
# l8 [9 q/ o8 w# F. ] TiXmlText *AgeContent = new TiXmlText("22");
; o, W5 [+ W5 E, A+ j% M NameElement->LinkEndChild(NameContent);
9 r8 r( x( x' P* S# z0 G* Q3 X5 n AgeElement->LinkEndChild(AgeContent);
+ Q- u: i( U; N CString appPath = GetAppPath();3 O3 D( w& f! H4 G+ b' r
string seperator = "\\";* w. f- u* L# C1 H$ J; x- ~
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
3 b; f1 d0 @+ [) n myDocument->SaveFile(fullPath.c_str());//保存到文件( ] a0 T7 j/ a2 I r) |
}8 [% J$ P5 {, s! o3 T- A. ?+ t" S
catch (string& e)
. m0 S) s0 |# h. f {
5 V" {# h6 M% W- Z return false;
) j& N! z7 C# T w }
$ |) z* c# S0 X j8 U% T return true;
2 Z4 d' Q& M' ~, l" b% I! X}
6 s# K1 O) X. F+ R9 X1 s9 Z' g7 O5 h+ T
bool ReadXmlFile(string& szFileName)
0 X- j; M, p6 {{//读取Xml文件,并遍历& s* i1 A# q5 [1 i
try
( a- F3 [9 t. X. X {- g o9 R5 `5 I( x
CString appPath = GetAppPath();( O, E) o6 p1 H/ T2 B
string seperator = "\\";* G& i# t8 q' Z: F2 J
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;" C; M2 k2 r) D% y
//创建一个XML的文档对象。. \( v: |2 r# ?' I
TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str()); c3 h' l, y. p9 }6 M- }( ~
myDocument->LoadFile();
6 U' g8 z0 u% @8 V* o, W- B( Q //获得根元素,即Persons。* g. [ v' Z) q z
TiXmlElement *RootElement = myDocument->RootElement();
2 m4 o8 F' i! B. X( z //输出根元素名称,即输出Persons。
# L9 ^- E7 L- l8 V# _( x; e cout << RootElement->Value() << endl;
, f5 x" `" R( I6 A. E+ M0 I! ~ //获得第一个Person节点。
: U8 L' ?( m) d& h, ~ TiXmlElement *FirstPerson = RootElement->FirstChildElement();
# n! v$ V) t/ L- ^ //获得第一个Person的name节点和age节点和ID属性。! T5 \5 G" W( u+ u7 r# S2 x) j b
TiXmlElement *NameElement = FirstPerson->FirstChildElement();& {* t5 D0 v9 d( ?
TiXmlElement *AgeElement = NameElement->NextSiblingElement();2 e" m* t g/ N
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute(); s; J5 ]( I ]# K$ n) }& j+ {# F, _
//输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
; e4 Q' w5 x9 d0 w8 y cout << NameElement->FirstChild()->Value() << endl;
7 h" b4 d( k+ I$ \ cout << AgeElement->FirstChild()->Value() << endl;
) S. G1 q7 d% | cout << IDAttribute->Value()<< endl;
6 q$ b q' q7 u( y& G4 N }$ f: X4 A8 Y2 C
catch (string& e)7 C5 r( c6 U/ `# Y7 ?
{$ O! j r( D9 D
return false;$ T7 f; E; p4 q$ {+ W: g
}
1 L" E' x, ~9 d9 k return true; d# c- c$ i8 {- w4 b
}
# q7 l4 A& ?- A; z& Aint main(). ?6 s- F! o* H7 e! C* i& _: ]! e8 c
{$ Q& g) f. L" w
string fileName = "info.xml";0 F; }. K3 C1 T
CreateXmlFile(fileName);
. G' U0 u8 m# d7 d ReadXmlFile(fileName);
8 L! z0 H( i; `7 P4 ~# @}
2 M, p# O! w5 z9 B, N+ K" ]/ ~" T1 u9 S- z) ^* t
- M( m2 i: n7 ^ |