请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段:
1 U# [$ {' c" s' ?8 W <Persons>
. A8 Z9 v- w+ }1 R; T7 {7 w <Person ID="1">0 d6 i ~& r( t( I
<name>周星星</name>8 v* X2 o& o% a* r
<age>20</age>( V+ ~1 ` E' r% @
</Person>3 R$ S# h/ i- |# }, `+ d
<Person ID="2">6 ?+ O. S7 k2 l! g
<name>白晶晶</name>' l2 w0 O5 l( V+ _- G
<age>18</age>$ [( O( c+ W9 V0 x @3 U m
</Person>, w( J6 t. Y' J5 N
</Persons>
1 p9 J$ T5 F5 K# N. D. L, Q
; U( `/ Q" w2 b8 B& b+ \" v" S/ x( y 在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文件:$ `' i1 f) G; h0 y% a3 L. @6 k
<Persons>9 M5 K0 Y* T7 U6 K
<Person ID="1">
5 B- B/ I# V5 k( N/ k8 G( e& B2 V <name>phinecos</name># E- ]( s& K( ?3 ?8 a& x- V
<age>22</age>
- R, ^) Y( H8 o' p _! t+ N </Person>
- T6 i! B2 W. r. }2 r</Persons>
) ^! e' @3 m! E9 ~, g
- j0 P& [6 ^7 o5 o- P读写XML文件的程序代码:7 D- B3 @4 {+ s$ A7 U' M3 o/ u3 a
#include <iostream>
7 u: o% H$ C* \$ l#include "tinyxml.h"8 |: r+ N% h' @( _3 Y: r
#include "tinystr.h"
" O; @% {8 W+ U$ G: I* g' }4 X/ S#include <string>
) q- f7 l% |% u b#include <windows.h>
) R2 h4 ~( o* y6 z. ]8 z#include <atlstr.h>
# B4 U: i/ U K5 ]using namespace std;* y, J- }9 e' Q
( \; T) j- I8 }4 W0 {( h7 f/ Z
CString GetAppPath()# W1 @9 W; O/ }& ^( Y/ Q, }
{//获取应用程序根目录* R J7 |1 Q* q# O( Z+ A. z" G
TCHAR modulePath[MAX_PATH];
8 k" q2 Q! }7 V$ Q; E9 q) K% I GetModuleFileName(NULL, modulePath, MAX_PATH);8 F& J) C2 h a& `2 q3 \
CString strModulePath(modulePath);: p. C: P$ y) a4 K K
strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));8 b' |& V6 y: x5 A: O3 v% R, n
return strModulePath;$ P; @5 C3 R6 i* D% \% o/ E
}4 v: o& l4 Y% w$ j. L% b- R: x
! z$ S! u% z9 N" U) X7 O& sbool CreateXmlFile(string& szFileName)4 R# H! j- B5 A! F- C* J
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
" a/ b1 b0 W( m# Y6 U, H) R. ^ try
# X1 }# s5 ^; n" u7 {! a: O" b {8 M* U7 U4 h) g5 `2 E$ }6 g
//创建一个XML的文档对象。
v" o. p7 M2 U, ? TiXmlDocument *myDocument = new TiXmlDocument();* Q$ o) F5 J) e2 I* e
//创建一个根元素并连接。
% d1 n" V. k. c+ M TiXmlElement *RootElement = new TiXmlElement("Persons");
6 H) Z& H4 ]% j2 F, h1 Q myDocument->LinkEndChild(RootElement);
/ P6 C' {6 j3 |; n //创建一个Person元素并连接。
/ c$ L S- D# Y4 Y$ n4 T$ j* c. { TiXmlElement *PersonElement = new TiXmlElement("Person");
" r' a+ A d9 I8 t: `, a RootElement->LinkEndChild(PersonElement);
( w" u7 S/ c7 \! t0 x, t; w
, M$ f/ P; I T' k; U d$ A1 K' d. D9 U- d 登录/注册后可看大图 //设置Person元素的属性。
0 j* a; I' p f% s# L PersonElement->SetAttribute("ID", "1");
. Y7 S6 ?/ G" O' D" B //创建name元素、age元素并连接。( V$ ?: K% k) t' E, S
TiXmlElement *NameElement = new TiXmlElement("name");5 u4 M! P7 m9 P' _) d! s% ~
TiXmlElement *AgeElement = new TiXmlElement("age");% w" V. D: E x; _; B( e2 {1 E. t
PersonElement->LinkEndChild(NameElement);$ P* k- M9 A1 N$ h3 q
PersonElement->LinkEndChild(AgeElement);
1 ~$ p- E2 ~6 z: q% I! R //设置name元素和age元素的内容并连接。
1 `% n3 Q( {3 C' | TiXmlText *NameContent = new TiXmlText("周星星");5 c5 ^4 M2 A0 c2 C4 r; W; U3 @+ d
TiXmlText *AgeContent = new TiXmlText("22");* s( u9 q/ D0 g# b$ `" R
NameElement->LinkEndChild(NameContent);
1 \6 t7 u0 S* X" m AgeElement->LinkEndChild(AgeContent);
$ X$ j6 T' C% q7 l$ M0 n5 g CString appPath = GetAppPath();
" O; n5 P3 x5 M8 w3 s; Z string seperator = "\\";! J8 t, Z# Y5 X+ P' m% G
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
/ v2 r; m, C2 J4 A myDocument->SaveFile(fullPath.c_str());//保存到文件* A: {; L2 f9 ^9 k1 @' {
}
1 H7 q' T$ z* y catch (string& e)
* Z2 c. i2 R; i {
+ X5 h' O: G1 s' _1 K p' w) F6 i3 k return false;- m. u0 y! _9 y( a5 `4 R
}& G# l0 I/ \' T9 O7 c
return true;
. v# u7 v* W& T& E a1 L# r}
7 ]+ t5 J' b" g5 ^4 {" L; q0 b0 B* G' u+ U, T: _
bool ReadXmlFile(string& szFileName)6 f( y$ |) S6 J! z" M
{//读取Xml文件,并遍历; H1 y5 z) J/ O1 I$ M r5 S
try
$ {6 o9 g* S5 _: _3 u1 B/ m {4 m% O* s" r$ P' k5 W F
CString appPath = GetAppPath();' s6 S6 P# J0 O. i; u, ]
string seperator = "\\";
- n0 z5 C# R7 P* w string fullPath = appPath.GetBuffer(0) +seperator+szFileName;+ O8 ?- D' w1 N2 E7 B& A
//创建一个XML的文档对象。( `7 J: ~' Q: @" R% k. x) l
TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
, x& w3 T3 [1 C; @! l3 q: E' C myDocument->LoadFile();
4 u2 w: E3 A; w j! @, r7 W0 r //获得根元素,即Persons。' V( B5 u( [* H0 I: Z8 k- F
TiXmlElement *RootElement = myDocument->RootElement();
. N( q5 p5 w' B f& u/ ]. x //输出根元素名称,即输出Persons。
5 B' c0 O4 o6 u$ u: a& M ?3 h4 `3 D cout << RootElement->Value() << endl;$ l8 j' ~- q; _0 ^0 J
//获得第一个Person节点。
; s' o1 c; L s" q! u. c: O TiXmlElement *FirstPerson = RootElement->FirstChildElement();
3 F! t/ [' h$ b //获得第一个Person的name节点和age节点和ID属性。
" m3 C) j$ L2 ?5 c/ k# L. x TiXmlElement *NameElement = FirstPerson->FirstChildElement();
" Q* \* @, G- r: o TiXmlElement *AgeElement = NameElement->NextSiblingElement();3 r8 ^1 P! L4 s* z3 }4 n
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
+ M5 x `4 i, B //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。, N" h5 v% ]7 D1 b2 o2 e4 @
cout << NameElement->FirstChild()->Value() << endl; c1 F) C8 s3 l
cout << AgeElement->FirstChild()->Value() << endl;; a3 I+ T: Z. s* q9 L3 u* h
cout << IDAttribute->Value()<< endl;
* ^8 ?- d1 ^% G% {% r7 v0 l: K; i0 R }
" [* x. _$ P, j! u) u catch (string& e)$ T* Y( y0 A4 r1 `3 J
{3 e' q7 N' F* l3 ]+ w! F1 O- J t- u
return false;
8 C' K K* e6 P# o3 @& ] }
1 z/ ^) m% B9 R7 `4 G' O return true;
# b! U. I/ Z: J" Y. g: k}& V8 g- T$ L7 [' ~# l# z
int main()8 P Y2 s7 {* C5 S; B* C
{
: F- U5 G1 Y# z/ l. Y: ^2 \ string fileName = "info.xml";
" ~/ _( F! I/ [+ b+ z CreateXmlFile(fileName);
& h0 U1 Z& L) F7 A ReadXmlFile(fileName);) Z9 A+ w* U! G X
}3 a( K" N3 e t5 A% Q- D
& `3 n6 Y4 F; ]( w! p& v3 ^. q" E
|