请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:0 N/ \" ~. U( `& c3 a [# w) ^
<Persons>
, ~5 N/ v# V& k& u; e% [- O7 R$ l <Person ID="1">1 q1 C" |5 M; B% }$ W- i* I; W5 N* {
<name>周星星</name>
6 U, @/ l9 x2 Z! \; I/ l <age>20</age>' i, Z$ \4 \0 t* ?# I; `
</Person># I$ y- a' f m* ?1 N9 A& I7 [
<Person ID="2">
- v& J, `; Y6 N; v) Z <name>白晶晶</name>9 `4 D0 N$ a; q0 K
<age>18</age>9 U% M" `9 k& ~ D. G4 b9 }
</Person>4 P) r4 L: `& A% Z9 W
</Persons>
: _0 I4 e. p" W
% I' s8 u& d: | 在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文件:
" s3 l4 q* x( _5 r" t) \ ]<Persons>, C2 ^( C: g- z* }( ~1 c4 X$ ?' O
<Person ID="1">
. L9 Y( m, u: O <name>phinecos</name>
9 ?- w. @% W- H2 q$ s3 i7 N; ^ <age>22</age>
0 K( e& O( F0 ~+ _' t </Person>, W: b- ]2 M( r, F/ p
</Persons>- [* X' _! `5 J' ~) g3 R `9 I
- J$ q/ K" A% a读写XML文件的程序代码:* z+ l) z, M$ D# b( n0 `: \/ z
#include <iostream>
# d1 Q5 D' D7 p, I#include "tinyxml.h"
( s5 |2 ?6 T5 f#include "tinystr.h"+ j7 K/ I1 W# {
#include <string>) o n/ A/ F6 f, H
#include <windows.h>
9 w, A/ ]/ f$ L6 P, a& @#include <atlstr.h>
, R. k6 W9 A' a* n9 Rusing namespace std;, q2 B6 X- E1 l
1 k% X7 `& [: j8 [
CString GetAppPath()
; e7 ?- I& B% F! @, D- h& |4 o{//获取应用程序根目录
7 G3 t4 u; X' |. X) m: o) {5 Z0 V TCHAR modulePath[MAX_PATH];
! y: p% A* o1 [- J4 l* p GetModuleFileName(NULL, modulePath, MAX_PATH);1 l$ O; j4 d% a* x; O# q$ D; `
CString strModulePath(modulePath);
" g9 O1 a' e2 {3 z8 H strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));8 O* A/ v( M7 s, O Y
return strModulePath;
+ k, n4 b$ {. S+ A4 I}5 E$ v/ y) F; W. O. Y
& Z! [7 A% Y1 K( ]4 _( Z- M! T/ I
bool CreateXmlFile(string& szFileName)
) t& {! s1 I% l9 h/ c3 B{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false$ g! Y4 g+ e6 X- o# j! u( {
try
. h; Z+ t" ]# e0 G9 {7 ?' D {/ e: v7 O7 \6 I# M8 @. O
//创建一个XML的文档对象。' A( \3 A5 C7 e7 Q+ ]
TiXmlDocument *myDocument = new TiXmlDocument();
' A2 n3 ~$ L0 U6 L/ F* Y$ P- t7 m //创建一个根元素并连接。% s0 g( w4 S$ _8 A* D2 z
TiXmlElement *RootElement = new TiXmlElement("Persons");% j' D7 k a) w+ L9 F+ P
myDocument->LinkEndChild(RootElement);6 J, b# ?# o5 B T2 G# v! X
//创建一个Person元素并连接。
8 s6 x% O+ o& e3 z TiXmlElement *PersonElement = new TiXmlElement("Person");
* K. J5 Q' o* V: o/ S* N. U RootElement->LinkEndChild(PersonElement);
0 _- H7 V2 R! w4 \ //设置Person元素的属性。
9 H9 X9 W2 }2 ^/ S' D9 o PersonElement->SetAttribute("ID", "1");
* a% N4 J- j: `/ V& W3 A //创建name元素、age元素并连接。
1 K4 W# @" U$ [- P" I8 `/ Z TiXmlElement *NameElement = new TiXmlElement("name");
! \; [ k9 x! w( V) } TiXmlElement *AgeElement = new TiXmlElement("age");& `# T& f! U7 H; z
PersonElement->LinkEndChild(NameElement);0 S4 [: s& h* U# ?7 }0 D, }
PersonElement->LinkEndChild(AgeElement);
. y: @- j! P8 b1 h //设置name元素和age元素的内容并连接。. R2 J8 _; z# Z! _
TiXmlText *NameContent = new TiXmlText("周星星");
) [. A" u1 W# I0 g* u, O4 L8 M TiXmlText *AgeContent = new TiXmlText("22");: H+ V$ p- @$ q$ m% G; ^; O" Y
NameElement->LinkEndChild(NameContent);
% k+ d/ t$ M8 ]' F, A+ K# S5 ` AgeElement->LinkEndChild(AgeContent);
/ { e+ j2 t, @& c' @0 x CString appPath = GetAppPath(); L3 W8 `, q, ?' g
string seperator = "\\";
* D( u& K7 b( Q: s7 W- t3 E& ? string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
( m: a; o& i3 h# m, [: B% X* O myDocument->SaveFile(fullPath.c_str());//保存到文件
; c( Z4 P- L f) Z, R }; s+ ?# ?- `7 R2 c/ q
catch (string& e)
9 I9 i; }6 ?" S+ i0 Y! K {) y& e0 j& z7 `" E9 {
return false;
7 G+ E/ L J- t6 |/ x3 r8 k }- F2 L5 \3 J4 R O& J
return true;6 z% V5 ]3 r9 n) D0 K9 P
}2 [2 c" C9 r2 e. m! J, m$ A" X1 m2 `
: n1 j' b" }4 {7 a; I7 v* wbool ReadXmlFile(string& szFileName)
; W+ O4 G! d" f R{//读取Xml文件,并遍历- D5 Z! u: l$ y* H5 Q! ?6 `
try' a& o$ y+ s; C' R8 _
{ Y' S. K3 @3 T" ^0 N) I# ]) I
CString appPath = GetAppPath();( [0 A$ S; e4 c( D$ D7 |
string seperator = "\\";
- ^9 d4 q' I l4 @ I3 i string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
# m. i- [! v% ?& j; t2 J1 L //创建一个XML的文档对象。
8 f0 _; v5 i6 D, V6 C& x" d; @" s8 q TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());$ ?! c* s, `/ n) s4 E5 m
myDocument->LoadFile();
" N; F* p4 d& w8 Y //获得根元素,即Persons。
' C! k o* O6 Y& [1 I$ K) ? TiXmlElement *RootElement = myDocument->RootElement();
0 h. B8 a& Q- M. l5 f2 y j //输出根元素名称,即输出Persons。
. R- C1 Z( E% L) s; O- n: N/ e1 K7 L cout << RootElement->Value() << endl;9 Y9 d. ~* L* P/ O$ K# q: z0 }8 }2 a
//获得第一个Person节点。4 m7 z/ S# @7 ]* q% r- h
TiXmlElement *FirstPerson = RootElement->FirstChildElement();
+ P' u" e8 M. _% m3 b4 ] //获得第一个Person的name节点和age节点和ID属性。
( j. v0 W! \; @8 |" K TiXmlElement *NameElement = FirstPerson->FirstChildElement();
- x, Z6 s. l$ H8 [4 _/ }4 l: q5 S TiXmlElement *AgeElement = NameElement->NextSiblingElement();
5 e5 D& n$ V% @7 h1 m TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
1 F9 w& H' b0 P1 x4 L9 u //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。( f8 `# k+ @! s. R- d* E) w- d
cout << NameElement->FirstChild()->Value() << endl;/ Z' A% ?3 i8 ~; m( U
- j0 j! u% d* J5 @( p$ a# r9 ?& v' m! Q1 ~% i
登录/注册后可看大图 cout << AgeElement->FirstChild()->Value() << endl;7 y/ X' P! R& Y
cout << IDAttribute->Value()<< endl;
) |. }8 `/ }" |0 o }
' }6 V8 e) ]# }$ O/ R Q, ?6 q catch (string& e) A. |+ Y; `: V2 [
{' Y4 j0 |; y6 `1 D7 D
return false;
1 C0 K. {! u! W6 o/ h9 i/ t }& s8 c' a+ F1 R/ G4 h3 Z$ Z# C
return true;4 T8 `# F6 A1 p' D0 I' V
}
, X) S" g' P- _# g1 ~4 X; lint main()4 j& k/ [% X# q6 d& L
{
* H, I6 u ^! |. h9 t string fileName = "info.xml";( E ]7 i! P. i
CreateXmlFile(fileName);: l. c1 ?9 j% u
ReadXmlFile(fileName);
, X: H: f3 m5 ^}1 k3 @: g% Q' q
; p8 W8 d6 O! D( O, A. F4 _0 a
7 O* m6 W0 W$ \7 z8 W0 U" l) |
|