PLM之家PLMHome-工业软件践行者

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

[复制链接]

2015-1-29 19:28:56 4614 1

320

主题

226

回帖

9784

积分

管理员

PLM之家NX|TC专家

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

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

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

x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
如下是一个XML片段:
7 X" `5 W& l1 K+ K/ Q  Z

% o0 i" B/ i& ^1 Z% _                               
登录/注册后可看大图
   <Persons>0 Y7 ^; Q; P# y1 y4 R2 r6 w$ v

. k) i3 R7 v$ F9 _                               
登录/注册后可看大图
        <Person ID="1">
/ [8 {, e3 W6 W: u1 F

* m  @3 G5 c! E  g! R) S                               
登录/注册后可看大图
            <name>周星星</name>
; \7 I, a, B6 y) c3 P
) K. w, z/ u5 ?; S. l
                               
登录/注册后可看大图
            <age>20</age>
7 G; o1 B9 O5 V- v( y" Q1 F/ B

0 V$ n" c- x5 t6 W3 @* v+ I6 _& E8 g                               
登录/注册后可看大图
        </Person>
! O% {' w% ^2 ~: s) _
6 I, I9 p- V: v& y3 P
                               
登录/注册后可看大图
        <Person ID="2">5 i" r0 b3 M. j& K4 E4 G! u
, ]5 f) Y/ P! n! z1 U
                               
登录/注册后可看大图
            <name>白晶晶</name>
8 r  y7 W, L6 Z. S. ^2 ^
, b8 Y" z! p2 Y+ P2 m( z2 N
                               
登录/注册后可看大图
            <age>18</age>
( g) Q. p, v7 B/ M% s/ k

2 q3 l, C% m. q                               
登录/注册后可看大图
        </Person>( B/ k5 V6 x" i2 D% w9 a8 Y1 `

7 w, v8 _. x' D) ]/ R/ W9 }                               
登录/注册后可看大图
    </Persons>' j0 H( a; Y) h' ^5 O) x

; C; s2 b& M8 d$ o                               
登录/注册后可看大图

2 P& Y- n, K% [5 e* b$ x% J
在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文件:. E7 l( i9 m4 k: y2 |" \8 U6 d' f% t
4 r8 C9 }& X* Z- S! F1 i
                               
登录/注册后可看大图
<Persons>
% b" P+ o( @2 G/ T$ [2 S3 q
$ f4 F8 X9 F8 {& q
                               
登录/注册后可看大图
    <Person ID="1">
" y  m( L1 L( f9 [, P
- Z9 v3 X7 e: A# k& \# X& C# E5 \
                               
登录/注册后可看大图
        <name>phinecos</name>
2 g; O3 k. S( }: C
4 M5 Z, B5 J' c  }  r$ t) x
                               
登录/注册后可看大图
        <age>22</age>
; n; g, n8 i: ~( s$ d9 I
& g- z! p5 J2 T
                               
登录/注册后可看大图
    </Person>6 ?4 [7 [7 K  N5 |6 Q" Z# W7 ?

2 Q3 m  F7 U+ V/ h$ F/ R                               
登录/注册后可看大图
</Persons>
8 h% {' Z% J9 l
' t5 ^7 Q3 }" T2 j7 Z
                               
登录/注册后可看大图

9 s( e9 s- }/ t6 P% p) A
读写XML文件的程序代码:, S% u# p  i6 S4 k* z

4 |7 e6 a$ b8 Q0 U                               
登录/注册后可看大图
#include <iostream>
$ A$ e" @; w1 s2 X6 j; N

' O! F1 a: i* K. Y2 T5 [2 P9 p                               
登录/注册后可看大图
#include "tinyxml.h"
4 \6 B; r( E9 o/ x

( M; k/ p4 h4 N* n# j                               
登录/注册后可看大图
#include "tinystr.h") v- t. s9 U1 b  I5 c+ H
; c2 w3 Z/ p1 z& w3 C  X# \; P
                               
登录/注册后可看大图
#include <string>* J$ ]. h" t% \5 t4 c
/ t) o, d! |3 B% s% B
                               
登录/注册后可看大图
#include <windows.h>
# J+ [3 |9 _  b$ x7 Z2 C

" b6 h+ B" @% i, b7 c2 X& m: i                               
登录/注册后可看大图
#include <atlstr.h>9 g4 c3 j. K" X/ Y
4 N: z/ F4 d) |: m0 I: J( q5 e% M. u
                               
登录/注册后可看大图
using namespace std;
0 Q! X* m* B5 G
& F$ y& l6 ~& t* c: b6 A2 m6 J* ?
                               
登录/注册后可看大图

, G  W; n* i  p: I9 Q$ Q
; d% w, e% G& S. q8 ?& Y
                               
登录/注册后可看大图
CString GetAppPath(); l$ T& i& r; |8 H+ s9 S7 M
7 O' B) M( q# n7 i* {, \/ |
                               
登录/注册后可看大图
{//获取应用程序根目录" H$ l) t9 |& F5 P- ]" M

. |) I6 x- C2 p. i  @, y& j                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
3 ?9 v# ]4 _# m2 O

; R& k7 ]; z: _2 B                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);/ z0 ]' `' n% n) S; m, ]6 q& g

$ m+ k2 O1 A9 A# I' U& ?                               
登录/注册后可看大图
    CString strModulePath(modulePath);
& B: K0 h( R, L2 m. M" n

* C' N, |' e" x3 Z( e3 V% v" R                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
8 P& M4 F- ?: b7 z8 T0 e
! U2 q1 B2 Y% J) h' S7 Z( x
                               
登录/注册后可看大图
    return strModulePath;/ C- x5 s1 B9 t* g8 B
. {" y5 e/ V$ _
                               
登录/注册后可看大图
}
9 V' ], |: }" E* M! G7 H
: \5 L: @) H9 Q3 H1 c
                               
登录/注册后可看大图

6 T  o+ Y+ ^) z+ Z/ g) U( @4 J0 g
& \! U$ Q% ?7 `7 m  d) ]
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
. j  r3 `% f* ?) ^& `# P" u5 Z0 Q
* g! }) I# A% c* f6 f4 K' j
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false' P" q) `. @9 M' z
( R2 p1 S/ P( ]3 V) W
                               
登录/注册后可看大图
    try
, ?8 V) |# M% O

( c7 ?& t4 B# x4 w6 I1 s% q                               
登录/注册后可看大图
    {% k* T! l( e, R, H2 r, l" N
# L; z3 B- X1 y0 C
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
. @. \7 o& _$ S( {
% Q1 [6 z: |  v8 @
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
6 L' N- m0 k: n6 H& T

' ?$ Z1 H! [: A                               
登录/注册后可看大图
        //创建一个根元素并连接。' y" P( w7 Y3 O- C6 J# n
* n7 c$ x, g; ?) S. o7 E
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
7 Y- z( X3 K" k- W  G& M* h

/ k9 e) J! F7 _9 A% U- {                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);4 D3 r1 q- K/ L. k

: a5 }$ I3 \7 k) y: M                               
登录/注册后可看大图
        //创建一个Person元素并连接。
5 m! O3 x  n* O% B1 X' ?) B) x

0 j' E* @( W+ Q& S% A: {* O; K8 r                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
( _8 R( R2 x; N. {6 l9 e0 u) f& E! v
; P  d5 e0 q3 n3 L% J0 V# f* h! D
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);; h& W$ F% a* I- h
8 y( [) U0 [0 C0 j+ n7 ?
                               
登录/注册后可看大图
        //设置Person元素的属性。6 k2 H- t" N+ s' ~* U

  X3 H% a( D; J7 C+ Y9 u                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
) D; a* q0 f+ k$ C) _
. y' R- H: a( F$ P
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。! q8 T2 u3 J. v* g" i" t: O# `) M

8 R! {' d, n0 x2 P                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
! B) O4 _/ Q" P0 h

) z* e4 U& D" F6 q" }- P                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
: }. u; R2 e1 r4 e! [

0 g: M4 b/ P* Z                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);! c1 T& g# k8 g- @8 K

& Q! q" s$ l0 V+ q* E+ \1 {2 ~                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
+ m, N9 O' d2 T/ P3 o# R2 n
+ E& J' L9 P& m" h6 b! u( n
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
  z7 S% q: |' O' w
6 l& N. H: J  k3 N8 m/ {
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");6 M+ P  T- f. |* j; M" B

# \# R$ j9 q, G. M* f# u                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");! q6 K% |) M3 Y6 n/ V$ x7 Q3 i% O

) f4 I6 J& W5 A* A) W                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);8 }) s/ M% h2 _# {
# E5 d; h2 G: [4 I: G+ @
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
. Y4 P) y2 v2 H6 Q( X
+ e! e, |' o) I. M+ P  Z% v
                               
登录/注册后可看大图
        CString appPath = GetAppPath();  a) [+ |! p; Y* |7 ]6 U1 E# q
: |4 B- Z# e" i/ g$ T5 w
                               
登录/注册后可看大图
        string seperator = "\\";- a9 i) T6 T) t( i; r7 t0 \5 C' G$ Y  R
3 ]8 ?' ^4 H- w2 X; B
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;; j- U1 x" i: ?" x3 x6 W

0 q3 \- _$ _) M* J6 n% K4 @                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
8 C* d8 V9 S) c, B  B; Q0 Z" N

0 k& y, m6 b% _# k. A/ A. g% W  ^7 @                               
登录/注册后可看大图
    }5 z0 V1 I! t& v/ u6 Q

: G8 k5 m  n' }4 u                               
登录/注册后可看大图
    catch (string& e)
$ P% O+ y8 q. W5 c! x" `
" h! Z. {* z$ }7 b2 {+ N
                               
登录/注册后可看大图
    {
) P) D5 N- D) R% r5 e7 c1 G, @

9 K4 m; y0 v+ S% [2 ~                               
登录/注册后可看大图
        return false;
) h; y! U' [* \: Q! z, q
3 T; ?8 E5 v' R. J6 o8 S
                               
登录/注册后可看大图
    }9 j5 k2 v5 P, K* [1 O6 B2 W2 U
, l; j$ K( A1 s8 C
                               
登录/注册后可看大图
    return true;
5 R' E& Z+ K. i2 ~
* W, n$ g4 k( w1 @
                               
登录/注册后可看大图
}
, J4 h4 {3 @  P

  |6 {7 i2 b6 q' \: n# f                               
登录/注册后可看大图
( _* q: t, L$ Y! D7 ^0 l! c6 N+ c. }
- s6 w6 p* w4 w+ Q; G
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName), N' i8 t3 {) d! K/ X

: m) `7 }  f7 j6 Q: I1 h. ]% ^                               
登录/注册后可看大图
{//读取Xml文件,并遍历
' ?. Q/ C) y9 W5 s5 W8 L, x" W8 Y
6 g8 q% S. K4 t, G
                               
登录/注册后可看大图
    try- Z% f4 M, q7 z1 L& f3 ^

3 o% c0 ~( K; s$ P2 n( B4 z" H9 Y7 ^                               
登录/注册后可看大图
    {
5 N' n0 M% G/ R$ n. F5 z

2 u4 F9 |% q% A" F. }) L7 ?                               
登录/注册后可看大图
        CString appPath = GetAppPath();
0 d1 R1 P( q' {9 `2 K# f, I

: l+ h( C/ @1 a1 M4 \7 _  x: c5 D* V                               
登录/注册后可看大图
        string seperator = "\\";
; x3 c" G# g- E* S
$ Q3 s- O7 A2 s+ y
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;" y/ n7 E7 p7 F( W+ o* a' V
( c) S' i" L* D' W% j& n
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
# G- g5 H( f, G
5 L. o/ E# v. ~2 c( R
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());( ?9 R' v, h: F: ~( \

1 i. a8 b3 r2 a% P" q1 g1 y                               
登录/注册后可看大图
        myDocument->LoadFile();3 M9 }0 O3 R- \, }
0 U* y) C8 k9 p; I
                               
登录/注册后可看大图
        //获得根元素,即Persons。
8 [- I9 d6 t" h: B4 a/ }
! Y6 O. R" M8 D# k. T; _3 C
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();: O8 q) [) t1 T9 Q% Q- @

8 _: ?5 L8 c0 X" ~2 Z0 z! \                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。2 e* W6 D+ V+ T7 f$ t2 k4 C6 w
$ X5 P& P1 u. S9 ?: U9 ?. b
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
, u& \1 i% A- u8 h4 t
* g; Q; T- Q" Q. d: L# o2 O
                               
登录/注册后可看大图
        //获得第一个Person节点。; E1 ?; i5 f) @5 H6 F6 q

) s6 h5 {) y) F' m                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();0 A& u3 q* {/ o# z0 m4 h2 m. l
7 l% t: ~% H( N' e0 g: B$ g
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。( f0 f5 c3 m- y# u# f, k$ a+ d

/ ?# e& N) H  S: x$ g                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();+ v8 C9 F6 k/ u3 L
1 G0 \2 D, g- q, z6 v
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();" k% w/ w: f! Y  N* p* ?+ G

) ^" }/ F. Z, j7 \; F. {                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();* [, U# D1 j% I# L
7 Y% L! l  f3 ^& O
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
: K3 |) c. [# z( d  [+ t/ a1 h5 O- e

5 _8 [* D9 [. `* K0 E                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
5 ^  g7 k2 T, Q4 i2 G; t- x9 ~2 M& I

  g6 r  m  y5 D5 O8 ~! L# d                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;4 N2 @- Z4 _5 ?9 v( e7 l6 x* E: o

5 s- p2 r( Y3 J+ O2 |4 d* |                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
+ O: Q- O3 G5 X- d
2 B$ y! t8 ^' @. z! i
                               
登录/注册后可看大图
    }+ z3 q$ @/ O' J; n
# F+ m# ^6 J0 m* _/ U
                               
登录/注册后可看大图
    catch (string& e)2 W  i. t' |, h4 j3 @4 z0 t
' v# s" [. @8 i. m, z; K; S
                               
登录/注册后可看大图
    {1 c9 l) I; l! e- o2 C

+ ?, r5 }# B4 L                               
登录/注册后可看大图
        return false;
. e  K1 n  k' N
* I- }) L% l. d9 ?" v, o
                               
登录/注册后可看大图
    }
4 d6 e4 x  H2 q& Z
" y" [$ y- i) X7 [
                               
登录/注册后可看大图
    return true;
1 S  v) T- k' }

" H9 v2 h" r% W0 Q6 Y                               
登录/注册后可看大图
}
8 r# b* [  Q, y: T' [

& J  Y, _  A7 @  S" h% K                               
登录/注册后可看大图
int main()
4 N- ~7 ?. K% G0 p' n
6 a# H: [1 z" ^! z& C4 H" B
                               
登录/注册后可看大图
{
- [, U2 L7 c4 v/ H- j
  v1 N& t$ x+ y! M0 E
                               
登录/注册后可看大图
    string fileName = "info.xml";
' Y  l' k) Z/ {9 J# B! l

' i$ i1 _9 X4 A  y                               
登录/注册后可看大图
    CreateXmlFile(fileName);' O' B. c8 d. |- H0 h
' ?& ?" W9 [4 n2 O* h; v; D$ S
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
4 ^- m9 r" c: q4 r8 {
' i1 s* W' L1 {3 a- l$ C
                               
登录/注册后可看大图
}
9 _5 t6 V3 f, w4 \( b: z6 S
, Y6 I6 W& i5 B6 o2 Y0 u* V9 F. {- j
                               
登录/注册后可看大图
6 a: b. \8 d0 J! S5 W! b

5 u( B: H7 K7 T  V6 `6 d- f
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

0

主题

24

回帖

121

积分

注册会员

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

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了