请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:
, a; \* |/ a0 s8 F+ m6 A% Z' X <Persons>1 @" D! Z' G- ~7 t4 b' `/ D+ ]
<Person ID="1">: h5 P% t! Y) W1 d1 `1 t! S
<name>周星星</name>
$ Z( N# y7 e! U, D <age>20</age>9 H, q w9 Z) M+ S7 _$ R
</Person>
" D$ O4 @7 v W5 c" m <Person ID="2">
. `6 |+ C, R( { <name>白晶晶</name>
x, J/ i8 y8 P" C4 y. N <age>18</age>
* x! w( e; ?2 H# s </Person>
2 J1 w' P$ C% Z* O. f </Persons>
! x! u2 h' U( H5 F, Q* P( R7 T- w
在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文件:, v! G% b; ^5 h( Y! t. X% b
<Persons>
- M, b9 n% d3 r4 T& I <Person ID="1">
; r1 \$ e( Q$ R+ f' f6 a- | <name>phinecos</name>8 l \: O$ j8 c6 l. e7 r
<age>22</age>) G9 c* w1 N+ k* t% U. f
</Person>
7 r; ^" H- G8 d$ B+ L' s5 Y</Persons>% S3 {9 A; m C
1 s7 C+ Q. C' o/ I1 U2 K" l" x/ f
读写XML文件的程序代码: a+ `+ Y0 Q0 N7 @( E3 ?% }% k
#include <iostream>" ~# ~: p5 @8 V
#include "tinyxml.h"+ e1 \" ^" m: [' U4 P) T% `2 p
#include "tinystr.h" h4 @! a' M) Z6 x4 o6 u
#include <string>
3 O; d3 V L# N% i a: }/ T8 D#include <windows.h>
5 | M0 E% t/ u4 B7 p#include <atlstr.h>
' ?. |. M: \: |4 T/ }4 C- h4 husing namespace std;
* f, {$ U( I$ l
4 R: P* E/ y8 Z3 F; e" GCString GetAppPath()1 P2 q" r: W! {+ X& e
{//获取应用程序根目录8 x @3 C; u. v+ {9 I7 u# U
TCHAR modulePath[MAX_PATH];
" `$ j( y; k$ @/ m: u v' c GetModuleFileName(NULL, modulePath, MAX_PATH);& _/ F7 I3 R. n( }3 b
CString strModulePath(modulePath);
0 V. d3 Q& I- {: o6 q' D1 Z" f strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
1 O0 \ p0 x* P ` return strModulePath;: s/ O8 G/ z( w8 a! F$ ?6 Z
}1 N) G( l5 q& v) G& q+ k
$ k4 i8 X3 `9 U( l4 K6 R& u4 Z# [+ H1 n: Fbool CreateXmlFile(string& szFileName), ^6 v+ O9 H0 q L5 k2 B
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
1 W. i8 l; ^- i$ K& W- q try) f* Z9 \3 a$ P) S- B% K- p
{* O$ O& a# F% C
//创建一个XML的文档对象。1 ^) s7 j' G0 K) Q N
TiXmlDocument *myDocument = new TiXmlDocument();. s' c3 r9 Q* ^5 p' V
//创建一个根元素并连接。. ]6 Q! Y9 O- {% c7 l. b
TiXmlElement *RootElement = new TiXmlElement("Persons");
" g6 `2 c8 d7 L2 l9 m" u6 { myDocument->LinkEndChild(RootElement);
) I* N+ \7 U8 M2 v //创建一个Person元素并连接。8 X& m6 W9 x8 n9 P# c
TiXmlElement *PersonElement = new TiXmlElement("Person");
$ U/ {9 ]+ N/ \! N6 H# U4 ~0 {3 j RootElement->LinkEndChild(PersonElement);
' R7 c$ |2 U% q5 }( E) x3 I4 P4 | //设置Person元素的属性。! V0 t3 I9 f$ G
PersonElement->SetAttribute("ID", "1");: _, U$ i6 F$ _7 ]* _( u8 m
//创建name元素、age元素并连接。8 K3 I/ @. _$ j" A q) _
TiXmlElement *NameElement = new TiXmlElement("name");
; [* L( j) i) `# s/ m( b TiXmlElement *AgeElement = new TiXmlElement("age");( h. m& X- g2 k
PersonElement->LinkEndChild(NameElement);
+ \" V) D7 {. N# \ PersonElement->LinkEndChild(AgeElement);# T0 U4 s8 H* Z h6 }/ G: t
//设置name元素和age元素的内容并连接。
# w3 [: I& p* b TiXmlText *NameContent = new TiXmlText("周星星");3 _9 {! X _. L; g9 \
TiXmlText *AgeContent = new TiXmlText("22");
2 J/ q! D* e" y" S NameElement->LinkEndChild(NameContent);
- r! |+ c6 y; _- Q AgeElement->LinkEndChild(AgeContent);
' S% p+ J4 L" y CString appPath = GetAppPath();( X' ]; s6 r# B: O8 T; L! m. `% G
string seperator = "\\";
% k# K, \- H; e! u1 V string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
$ @3 N4 O' s7 N2 D myDocument->SaveFile(fullPath.c_str());//保存到文件
; C. f7 v+ y/ Y' b. x# g }
# H# O5 ~1 E# o( g4 [ catch (string& e)
, d8 U d1 o; Q5 j7 E" e6 W$ r {) ~1 X! E3 R% u
return false;( ]' Q6 ]% Q) {; ~& X
}! [7 [) ]7 F6 |# i6 N0 L
return true;; ~0 b; X% W: u$ l: \$ [. I& ?
}
0 N' x7 O1 `! v& Z9 g/ }( Y1 u
8 }! x& y) H3 p/ Z% z/ b( ybool ReadXmlFile(string& szFileName)# c, \' y, Q0 B4 S* j
{//读取Xml文件,并遍历. |& P B) U% o- c
try! G* l3 P, G0 B" F) j
{
0 K2 r8 n/ `" \! b' I: G$ o CString appPath = GetAppPath();( U! I$ h0 g. s
string seperator = "\\";
/ I0 V; ] m% ?0 T8 r* e2 h string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
# q0 O9 H# q8 X' C: [9 |- _8 } //创建一个XML的文档对象。
/ x1 O* h% @/ w5 A" Q TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
! s k) W: f" @( J w- n* ~3 f myDocument->LoadFile();
7 N: x0 n2 m- j4 F4 P3 _% } //获得根元素,即Persons。8 s2 `" J6 U7 @: d8 K* n5 @
TiXmlElement *RootElement = myDocument->RootElement();$ T) ?+ e$ ]2 w4 g: |5 J
//输出根元素名称,即输出Persons。
' G8 d; h6 F; K+ T0 @ cout << RootElement->Value() << endl;: i/ \( F" Z+ [2 B6 \" y" Y' a
//获得第一个Person节点。
. y. n# _7 S$ z/ A9 l6 D TiXmlElement *FirstPerson = RootElement->FirstChildElement();
0 e) |" o2 X: ^: D% ^+ i //获得第一个Person的name节点和age节点和ID属性。7 c5 k: L! G5 \8 W
TiXmlElement *NameElement = FirstPerson->FirstChildElement();: K5 W% |1 w5 q6 {6 U7 Y0 c
TiXmlElement *AgeElement = NameElement->NextSiblingElement();
9 s" b! A7 B0 _' c# q1 V TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
7 R8 q1 ~$ Z4 t& a/ c //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。2 z3 P. v, l% v
cout << NameElement->FirstChild()->Value() << endl;
^$ n9 B$ U& ?9 W6 c cout << AgeElement->FirstChild()->Value() << endl;1 f& z, L: d+ |9 D3 U
cout << IDAttribute->Value()<< endl;
4 G( T7 q* L0 q, Q; r- M$ ], a! A7 N }8 c+ z: A; y# G; Q; b
catch (string& e)
+ |: `) H% }, J2 u' b+ m7 N( b {
! I) O& B6 [& a return false;, j* v+ l& M9 r: D. @( Q# }
}1 D9 ]) m9 d+ ~) y- n
return true;
f9 r( Q; z3 f' u8 c}1 E3 m# g$ r( }& k
int main()4 B# {4 o- t5 J4 j+ o
{
+ C3 d j1 X- Q A, f- _3 t- N string fileName = "info.xml";2 a0 W$ e k; W! d0 s
CreateXmlFile(fileName);$ H2 Y- k/ {" j* V. _8 n
ReadXmlFile(fileName);. F! Q; A3 i0 T2 R1 ~& j3 G; |
}
) s! L* Q4 F/ n( A/ L" L K
. e& Y+ p1 a- N6 b r5 c* u
" g6 |: r& O6 ^/ b, |6 o, Q! A |