查看: 4792|回复: 1

[转载电子书] 使用tinyxml插件来处理C++的xml读取和写入

[复制链接]

320

主题

226

回帖

9784

积分

管理员

PLM之家NX|TC专家

积分
9784
发表于 2015-1-29 09:24:17 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

×
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
如下是一个XML片段:  u3 x7 Y# Q4 f3 j2 u9 ^1 `4 _6 G
1 L% p2 U: z  T+ \! m
                               
登录/注册后可看大图
   <Persons>
6 o- |% Z# c& C. a+ Y. X

) _  _/ \1 {8 m1 z& l- I7 Y                               
登录/注册后可看大图
        <Person ID="1">+ `9 N! Z: z) \. |! w2 o
2 E5 q# L" P' x8 u) Y/ x2 V
                               
登录/注册后可看大图
            <name>周星星</name>4 ~3 i' R5 e/ E2 t4 V! Y

. G, x6 v! e; A1 A                               
登录/注册后可看大图
            <age>20</age>2 S# B3 I' {8 q# a
+ \7 \; u9 [6 u0 H# v3 Q# a+ w3 e
                               
登录/注册后可看大图
        </Person>
+ d- v, x* N; O$ X3 a4 n0 k& p% n
( N) [9 @2 |( w% T6 G
                               
登录/注册后可看大图
        <Person ID="2">
. P. R* ]& s7 k* C. S
1 z- @/ B: V! m/ \0 T0 _4 o
                               
登录/注册后可看大图
            <name>白晶晶</name>( Q2 @3 S8 K' ^% `# t) Z, \7 w
5 ~( [4 U& l" S0 `/ r% Y5 _
                               
登录/注册后可看大图
            <age>18</age>+ r* X! }, F0 W! R
' h  C+ r' t5 y9 r
                               
登录/注册后可看大图
        </Person>
/ I" u( N& I- A
6 X- E2 u3 D1 E4 I5 d# _. A3 Z
                               
登录/注册后可看大图
    </Persons>
9 s4 g, ?4 ?+ e3 d+ k, a' W& g

9 s5 F2 n7 X4 W3 ]7 h" j                               
登录/注册后可看大图
; k: K# c4 k; Q+ I1 F, m. M
在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文件:, `& D$ ]  ~3 w- {3 a7 }; L% k
, k7 x  m+ W" P0 ?- G
                               
登录/注册后可看大图
<Persons>, X7 N+ F) M+ }& m7 I$ A% C+ |
9 d- M* [. ~" Y: {( ]% M
                               
登录/注册后可看大图
    <Person ID="1">
. o2 G$ a$ L! F8 a, R

$ v  l$ K5 E$ ]/ k                               
登录/注册后可看大图
        <name>phinecos</name>
  t- d- Y. C# ~( i, L9 `- h# @

& N% j. i( T9 W8 I. M6 g                               
登录/注册后可看大图
        <age>22</age>
8 r+ b3 P* {* _+ ^: C( h% R6 W- P, P

  j  K, u! [: W  E# a! r+ p                               
登录/注册后可看大图
    </Person>, Q, z1 D% a# O+ S3 x; W9 w
1 i. ~4 z* B2 ^. Z$ h4 O
                               
登录/注册后可看大图
</Persons>  r+ Y- Q* I: `

+ v4 ]6 o& \+ [. E                               
登录/注册后可看大图
# j3 `, ~3 k- u, \' S
读写XML文件的程序代码:+ D% Y' z, u9 u4 R1 n9 h+ i' y; _

" _) c6 J; I8 _2 Z. k8 P' u                               
登录/注册后可看大图
#include <iostream>
# Z2 i; ~* C3 G1 _3 U2 [' K9 B8 t

3 w$ G! ^2 t0 [5 m3 W                               
登录/注册后可看大图
#include "tinyxml.h"
" L  Z, M' G  i! V# k- L# I, i

5 I2 q2 t) O& r0 `: l9 X                               
登录/注册后可看大图
#include "tinystr.h"9 w2 y, n8 [2 ?
! F% w! |# j4 r1 `/ ]0 C5 w
                               
登录/注册后可看大图
#include <string>
! h9 u, G/ D, G) a8 D$ c: I( H

. R  ?$ {7 }' Z1 [% I. }8 a* Y                               
登录/注册后可看大图
#include <windows.h># x7 G* F  `4 g  L
. y' _! V5 ?. j+ S" o% g/ Q
                               
登录/注册后可看大图
#include <atlstr.h>
. X! j3 f0 C, V' d& I1 H

4 u; p9 k9 Y+ v2 y                               
登录/注册后可看大图
using namespace std;
# J) D8 k6 j' |4 @& S4 |4 ^6 Z4 B
+ R1 S0 j; P$ s7 d; b' [
                               
登录/注册后可看大图

5 d) B1 @  M. s' I7 y2 Q9 g
* ?* F% o% w4 h: g
                               
登录/注册后可看大图
CString GetAppPath()& [" Y' ?  t) [5 ~, B

2 {+ a4 F5 E4 {0 i                               
登录/注册后可看大图
{//获取应用程序根目录
# g) R" m; F" i$ i; u9 u( i

2 y4 z' O: X4 T% P) H3 _/ `                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
) P# ]# a. e( X% k
+ k9 f; S$ T, ~2 O! z: T& `
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
" G: m" }% V* r7 E2 W

" H! f8 Q2 I  |  d                               
登录/注册后可看大图
    CString strModulePath(modulePath);1 z' ^! @. a( V
) u! \+ u# ]9 n+ R. r% {  ~+ E
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
! `4 ?) m" @6 u! o2 f( w& O% K9 c

/ a, j. {: W' Z  |& Z" l+ @" d                               
登录/注册后可看大图
    return strModulePath;6 a' k0 c9 t) a, Q; B

1 T; U* y( _8 D) C" I" s                               
登录/注册后可看大图
}
; s5 X+ o  m/ D
. H+ i: }4 j3 @: ]5 a4 _
                               
登录/注册后可看大图
! ^5 B( T+ O& Z- P6 @3 `6 F% _

- g  B0 |, _( j( o0 k                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
9 Y9 M1 _6 I" I$ q* N, F

& @+ g4 q0 \5 P" [8 m                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
7 G4 a* R3 k$ b
9 u4 ~. Y  e5 \' d
                               
登录/注册后可看大图
    try
& p) q( F4 a6 w5 D; x/ v
! k. l- O2 w1 ]0 d  x: g" w5 [
                               
登录/注册后可看大图
    {
7 v9 g0 I4 m: i/ G) c( b

, X) X. H1 x; u' g: F                               
登录/注册后可看大图
        //创建一个XML的文档对象。
# L( Y8 Q6 F7 k
8 X) B) k; g3 }& d+ k" U- ]
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();# d! V1 c' M+ K

) n% u) l: q# x( Z1 f8 Z                               
登录/注册后可看大图
        //创建一个根元素并连接。! I- Y$ F0 a" n) ~; s/ U
  W2 y# D. u( J& g9 o
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
( y4 G- d+ c4 |9 O: p# \

' ]0 b1 Z( _4 E: E; }                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);+ R2 J+ j9 z* ^& e" P6 P

5 i( V' H- k% A0 U                               
登录/注册后可看大图
        //创建一个Person元素并连接。/ Z- A% P2 [, l% E9 V" m; r

6 h8 k5 X, j" C% x# S6 b                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");- D- R" R1 |  M( R2 e

- u0 `. O) O6 q. p0 q                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
( d/ a, F, {2 c4 c
9 Y2 y) q: P: g" h* t8 ~  @
                               
登录/注册后可看大图
        //设置Person元素的属性。
+ s* j) Q5 o) T1 H, F

" |) p3 h& i: h$ n" a                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");" e% r) @( r: r/ N: M
0 F$ W! {: ~) i% B/ x% ]
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
  J$ x: }  x6 F5 V8 O/ K
, F& `; W* U% z7 O6 B- ?3 A3 W8 _
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");; d0 T) r& o# T- z* J7 t
2 X* i9 @( K/ z9 `
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
! E/ C  y$ J. @$ j1 z- v
7 U0 P( v; P7 o2 q  C) l$ L/ m/ |5 |% Z
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
5 Z' v% S$ Y1 I1 {" M- O) r
* W; h% s% G5 R& `" p: x( h
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);& m8 ^/ h$ K2 \0 r3 {( M/ G! s9 n
" ~0 ^2 n$ G8 C0 ]& k: L: V2 N
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。3 y% B6 D: z* c3 A; @' Q5 E7 n+ A0 K- I

2 I* Y2 d. D4 F1 n  l; @9 Q% x                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");! C+ ?; |3 S# a: v9 F

  h5 p( J. R" N6 v0 A) d                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");7 K  p; W9 M6 r1 s

; x! u; n$ Q. R, y, U5 E                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
/ B& ]1 m3 w3 Z  L" W( R- q

* ?& l8 d( V) ]; f" x* c2 @/ s                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);& P6 ~: c! p0 N! e& G2 Z

% h1 [, @, s3 S' w' S/ c3 y                               
登录/注册后可看大图
        CString appPath = GetAppPath();: a6 k2 H0 q. |9 c$ j3 Y* z
* I+ D# A% Y& }. h
                               
登录/注册后可看大图
        string seperator = "\\";
4 M+ v8 T6 V- v, N
  N8 N2 V4 {: N! r
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
" \$ b: a5 {; L2 B* Q. U3 y+ H" H& ?
) w- _2 d. [( R0 F# d" O, |
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
* P) z6 W5 X4 G. H
+ S$ M# y4 _& i9 g, U+ ~$ G0 a
                               
登录/注册后可看大图
    }) e+ u( j) v! h6 V4 e

/ `  o6 [8 s% @& E, ~" k: U/ b9 j+ ~                               
登录/注册后可看大图
    catch (string& e)% y5 G& J9 N6 M# M

$ p5 U% m" j0 B                               
登录/注册后可看大图
    {- `* b7 D  m8 i

' H% U/ f& k* E4 v                               
登录/注册后可看大图
        return false;' ?  `! M1 o" w" Z4 g4 r0 Z+ @

: P5 A. w9 z% n3 R, A                               
登录/注册后可看大图
    }" U- i4 m2 C: D$ J5 n
4 W0 ~! S9 M6 w
                               
登录/注册后可看大图
    return true;
1 _# F3 j9 f& O; z3 o
, `* H8 B/ U3 q+ W, g) F
                               
登录/注册后可看大图
}
& Z0 `# D1 \2 L' v, M8 X3 P

- Z9 G- q) ~( {                               
登录/注册后可看大图
9 y' Z8 E1 V3 s" g' X2 I7 r1 z0 T
  y" e% j/ u' T1 P9 m3 h( G8 f
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
9 Q+ M, N$ Y# k8 ^- t: m& P
% d5 x' f# K! ?
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
2 M, e" M$ f$ e/ a# A9 x

1 |0 i' K8 g4 S5 g! @8 {" [5 |0 w                               
登录/注册后可看大图
    try
! ?+ i5 D' N3 r; m$ J! \

; m4 H! i: `' |                               
登录/注册后可看大图
    {! c8 c6 i+ y" X5 L( F( J

3 H+ m8 X' h8 T" c# P. S                               
登录/注册后可看大图
        CString appPath = GetAppPath();! s5 |! o  G* S' y- g1 V4 p1 c
' z' A7 `9 @4 `
                               
登录/注册后可看大图
        string seperator = "\\";
7 Q$ s  }3 g- ?
3 J5 W! M; Y3 g# I3 E% w
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;) P6 D4 `& _# o7 h

7 s- ?  L- r, {" `- C. c  Y                               
登录/注册后可看大图
        //创建一个XML的文档对象。& W7 q% f" _* }, j5 z2 t; u

  V" u* j  ~6 ~! x$ {2 M! w; I                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());5 \; {: v# z6 L& J  t4 M4 i, @
  A: E1 t/ G: P5 [- |8 [; ]7 ^; P& A/ y
                               
登录/注册后可看大图
        myDocument->LoadFile();+ W5 W& A, _; ]# K( N
7 C; ~6 m. O/ n) k$ [4 C
                               
登录/注册后可看大图
        //获得根元素,即Persons。
  T/ A1 E9 v6 e5 }/ Q6 Z6 L- I# F
: W9 T- G8 Z/ k, k% v- b
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();& o6 x- O# V. k+ \, c

0 d6 F' F6 ]- D+ a- U0 C1 Q# e                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
, Z" H, C) c; L  q  Q/ g' Q4 {1 c3 N4 w0 A- T

. n, `1 Z1 b+ e% @$ n" R( i                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;: L/ u6 E4 b$ d. [
7 \( K; L1 L# r  J- T0 O8 q- o* v
                               
登录/注册后可看大图
        //获得第一个Person节点。9 M0 n  B8 m" {4 C- a

* x* v8 F* j- O9 T5 N                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
3 H" q# m! |* [. i/ v  K: Q
+ T; ^- D3 ]: {* I8 f
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
8 T0 `4 I( l# D

0 j3 [' L6 [  k# Q4 w                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();/ g9 `9 H. I! I+ N: I9 Z

, @% D9 S, o0 |% }+ _                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
6 Q  R: v0 h& g1 p, V

; k+ ], t8 @8 o$ {                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
1 ^2 N2 V5 j( y

. }: K# M9 f+ D2 T                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
' u4 b$ M0 m) o4 O2 e$ |# f

2 u' H5 ~- w# G! u' v& h                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
: S) d6 ?: z- m/ M
% ^* _( e" `9 v) s3 B
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;& Z: ^0 U' z. S1 N  C6 k

" p$ V* o9 r* p" U; J. Y                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
" B- g! t; o& ~& j- z
( p2 q. v) B+ w! |6 v: T
                               
登录/注册后可看大图
    }
* J: B( }! ?. Y2 _- \+ w2 ]
/ L& Z+ j3 B; p1 ]; T3 e3 G( }
                               
登录/注册后可看大图
    catch (string& e)# w' O1 H% g# c) l7 Z, `

1 O$ b, v% x. D8 j                               
登录/注册后可看大图
    {6 A- ]! L+ U0 s, ^6 Y
- Q+ ~/ I; y' I" e3 S1 M; L
                               
登录/注册后可看大图
        return false;, _! h6 w. h3 H. Q6 j; b

! ~; L  F) E" h1 F: L                               
登录/注册后可看大图
    }, S2 Q% u1 ^6 l# D

4 n' g& x) U; E0 |+ s                               
登录/注册后可看大图
    return true;
( s4 h+ v0 r. C# k! P* P$ J- Q

3 Z% ?, b* c6 k* M6 s# r1 B                               
登录/注册后可看大图
}: v8 {' N+ z- q. D2 n

5 W6 z' T. J8 ?                               
登录/注册后可看大图
int main()
- K4 I0 K% Y( K9 M% `
1 a+ c" T5 `$ d/ R, z7 V1 h: r- t
                               
登录/注册后可看大图
{! S6 {7 Y. b$ `: p
! c4 t( S9 }: R7 o4 g+ \# d4 C. R
                               
登录/注册后可看大图
    string fileName = "info.xml";) g" I$ a) C* ^* [1 \9 g
. l0 o9 Q7 V1 G0 M5 g+ n
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
" T# B& T1 b  r4 u$ W3 \/ \8 J* A0 Q

2 L3 I6 D1 G( F" P4 ?                               
登录/注册后可看大图
    ReadXmlFile(fileName);% @& v$ l% K3 R5 K9 I) h

7 o  H# A: w8 {, n$ r                               
登录/注册后可看大图
}$ q! v: i- L  M' f; f8 r

6 K6 X! ]- V3 z$ E                               
登录/注册后可看大图

! Z; L$ k" j: X) |
' M% {- s$ @8 z6 P+ o5 w0 M0 {) a
该会员没有填写今日想说内容.
回复

使用道具 举报

0

主题

24

回帖

121

积分

注册会员

积分
121
发表于 2015-1-29 19:28:56 | 显示全部楼层
学习了 请问是从那本电子书转载的  
/ Z3 H. A) c: y% U1 F- l$ t% m  g; a
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部