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

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

[复制链接]

2015-1-29 19:28:56 4631 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片段:
, k' A/ N) ]2 ~% {" Z/ v

8 }$ Q$ q; ]9 H3 x, Q                               
登录/注册后可看大图
   <Persons>
7 f0 c2 I9 S$ n* C8 ]
' {0 O, L9 R8 h: _/ A' N
                               
登录/注册后可看大图
        <Person ID="1">5 a; f& v9 Q/ Q$ e" x0 o& T
2 I4 k" \7 f; V) _- o/ X$ x: d
                               
登录/注册后可看大图
            <name>周星星</name>
  @7 E) \  t' R( F; n, z# @

0 C$ v3 s. y5 `" U+ S, w                               
登录/注册后可看大图
            <age>20</age>. Q& I5 @2 K; _. r7 U) b
7 r/ K2 b  p, p' C5 I1 a
                               
登录/注册后可看大图
        </Person>. E* h7 v& C1 a. U
% b% Y0 U( f: P
                               
登录/注册后可看大图
        <Person ID="2">% P6 ?+ {1 t3 Z( Z
0 W# a6 [  v# K" N) w. T
                               
登录/注册后可看大图
            <name>白晶晶</name>
6 b& [, p' |0 g- B" h9 J
6 d3 a' k3 h  V# A- V1 P
                               
登录/注册后可看大图
            <age>18</age>9 W" {, n  q/ h' C5 g1 L

; r  A& d  ^7 k" E8 R0 M                               
登录/注册后可看大图
        </Person>
' M+ E- ~2 s6 f: o

/ z* [. T" }. b1 }& M$ C& ]                               
登录/注册后可看大图
    </Persons>) K- z" x$ C" Z1 `  z3 e
6 R' I' K3 T2 L# s
                               
登录/注册后可看大图
! S6 `% m4 }6 ?
在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文件:3 V7 ~! D. `6 Y& A; x5 |

& F; c+ }# S+ w1 r8 F                               
登录/注册后可看大图
<Persons>4 Q) A; S/ g0 r' E  I% Z$ K, g1 A
4 k# i1 }) L6 ]
                               
登录/注册后可看大图
    <Person ID="1">* k5 z( ^" O5 T" n

& Q/ q' l& ]! b                               
登录/注册后可看大图
        <name>phinecos</name>! K7 D% D& u' r/ T- u' V* Y4 `0 S
* ~: E2 D! l6 }
                               
登录/注册后可看大图
        <age>22</age>
0 d3 F, P* Z$ E& o, ^
% a: b5 t) R" Z
                               
登录/注册后可看大图
    </Person>) a% W" k  t2 h1 m) V! k

6 M. l0 G1 n9 k- d* P4 A                               
登录/注册后可看大图
</Persons>) S" B% t" J; I  K! f

3 U; L/ X! p5 a% v" t. v) J                               
登录/注册后可看大图
4 ?! b* i0 I6 t# |; o
读写XML文件的程序代码:) O% ]' r- p- C. Q# i$ |) K

, V- g8 H, p& [% o                               
登录/注册后可看大图
#include <iostream>
3 |! M# O& n8 T2 A, E9 y+ D# X

, r9 o6 ~  g2 }9 R' G. J; _7 }2 E( s( U                               
登录/注册后可看大图
#include "tinyxml.h"
) u2 i/ K7 `  ~' R
+ U/ g6 s- P: ~' v: h) R1 p* S
                               
登录/注册后可看大图
#include "tinystr.h"6 u7 r" h+ {6 C2 y5 X
9 n. Q# P8 i1 i5 v
                               
登录/注册后可看大图
#include <string>
3 N' ^" H# u7 c( q3 V. G& I, {. k8 X
! c, E. @* y% s( M' t; O# ?
                               
登录/注册后可看大图
#include <windows.h>0 Z  ?8 w2 ~" w% C6 l& e+ X! W
: z$ q$ |7 c: ~6 [: v
                               
登录/注册后可看大图
#include <atlstr.h>% [8 Y# [8 m7 K4 N- {" i7 k' F

3 C( ^# |' S1 n# ]% t9 g0 d( s                               
登录/注册后可看大图
using namespace std;
6 [, ^# E4 |1 y2 u% k: _
1 j$ }8 B; P& d* z
                               
登录/注册后可看大图

, w7 b$ ~6 ?+ a) c/ H/ L  J/ C
0 W% n* @  ?4 Y2 e% d6 ?+ |: z
                               
登录/注册后可看大图
CString GetAppPath()
2 q4 R0 x" ?" ~0 g% c! W' x

$ X  a- Y& r; S                               
登录/注册后可看大图
{//获取应用程序根目录/ Y3 W9 [& u  `; {8 F0 y, h

+ O, U% b7 C6 }                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];1 l; c9 X. z2 d
+ Y. F3 S6 K! e* J8 c5 B
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);. Y& x' {, D0 r; \  i) p2 {
1 `4 y1 N; b1 ]) ^4 ?
                               
登录/注册后可看大图
    CString strModulePath(modulePath);: E. x: j: i5 U

9 F0 K$ ~. m& b( N5 O- r                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
! o* s4 a' M3 z9 I+ ~; }
" ^3 z* g# _) L" h7 y1 m
                               
登录/注册后可看大图
    return strModulePath;
, q8 P5 k/ c: O( w! M. R# k' [

! o: I; O- C" |/ k+ W                               
登录/注册后可看大图
}7 K1 U$ w0 h, {( y
% j1 }& U9 ?2 Z
                               
登录/注册后可看大图

. ~: h+ O7 [: C, n
% v7 S6 n; S4 c5 b& b5 z3 U" o
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
1 q% I  c9 e; {

, C. e  v6 j# ^% \- r                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false' o% j% W" t1 m6 }' [+ `; w
2 {, m) B. Y5 c, o3 Z* N4 o
                               
登录/注册后可看大图
    try$ d" p! k1 V4 h+ A5 [+ O

! \( l( U$ h5 {2 t. L+ [                               
登录/注册后可看大图
    {
$ Q, l+ _0 P# y  G) w
8 D7 z- `7 ]/ V8 I$ E& O5 m- a5 d; @
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
; a0 n% o1 ]4 j5 z2 }/ ~

5 r/ [5 ]& t5 C( c. X4 r1 Z                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
) i# K, C/ f! ]  f3 Q9 s
* e3 k: ]  @! i
                               
登录/注册后可看大图
        //创建一个根元素并连接。% x* |; K+ o! o2 W! |/ u
0 H+ C# `: V1 p7 Y, i+ W3 t
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
7 m4 w# _' }3 F7 u( i

9 X, D; Y# v0 S& A5 E+ Y7 G                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);+ ^1 q  ^7 J' J

3 {3 r4 x: z: z5 e                               
登录/注册后可看大图
        //创建一个Person元素并连接。& U, a) t; O3 U/ _; z

1 C' X5 y2 G$ m, e                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
* k: H: z; q9 F$ T5 l, A6 S

! r! C+ V% [2 d7 z% `                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
9 V3 W# z& t2 o, P: a# d
. a8 v" J, T- X- h( _
                               
登录/注册后可看大图
        //设置Person元素的属性。# w) e; ^/ H( B1 o1 n# a' u; p
- D+ r/ }( H: g  W( ?& N7 G  X) F
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
! Z# C+ y7 {# \8 w, _

; k% I1 d% ]1 n* |! y& }. s                               
登录/注册后可看大图
        //创建name元素、age元素并连接。/ ^7 M3 I0 b( K: O& Z* q& r7 j) R; j

8 N& e- |; F& g+ l) t  C6 C                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
' j8 @4 m7 w. d& J4 ^
4 H' P7 o' o) b
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
4 T% n- K6 h2 o& O

- {' x& _. u2 h! Y                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);, F1 \: q: Z  f7 P

6 h2 o, l& y, x9 ]                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
4 m5 a4 h8 W; @' B+ D5 A! X; _3 n
; P% w$ u! M  n) \
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。/ j7 N/ Q( K' J8 i' M
0 N& `2 h* A; @
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");! e7 `* W& b( h& q4 J6 H
0 h0 N( P  B2 {0 y
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
0 \; l2 ]# t8 y& z7 Z; w

. x+ ^0 t# I$ L5 V) @                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);+ Y" k3 E. B5 J
7 b1 E8 S8 i7 T% H
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
, c) ?4 ]  r! n$ l
3 T+ `) {+ y% i
                               
登录/注册后可看大图
        CString appPath = GetAppPath();2 g: o; U7 L% S# E9 R+ X4 O

$ n* ?+ R+ C- W: n+ v$ l5 `# Y) j                               
登录/注册后可看大图
        string seperator = "\\";2 \3 l* ~+ w- U$ n
0 T' n- n8 E; Z( y1 n! x
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;+ t) P! z; A- h* B$ F

/ L4 L  K# e! i& k2 S' J8 v: K                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
& A5 ]4 v* X/ O

" Y; K8 b3 N* u$ K+ a2 `                               
登录/注册后可看大图
    }
9 y+ f) b! M  |

8 z: m5 g% F; T1 a" y                               
登录/注册后可看大图
    catch (string& e), [* E. h# T2 L# w7 V: V0 N3 [7 j

' O& k4 d2 F- Y+ T& M# r: w. V                               
登录/注册后可看大图
    {
  c8 ]/ }* l' j' s! f& O
  _( ]+ s& _9 r: e# \
                               
登录/注册后可看大图
        return false;: o, ?1 \* m2 B* D
, I- d' F5 r" e* W( j/ ]
                               
登录/注册后可看大图
    }( [2 N% S1 d6 ^% P" F
) h5 j7 o6 H: |
                               
登录/注册后可看大图
    return true;. }/ N2 }1 K0 E* ]: X

7 ], M3 w: j* B" w7 I$ L1 o                               
登录/注册后可看大图
}
# Z" J3 g  X; C' ~! p
5 b$ z8 g' `9 T3 ^1 Z
                               
登录/注册后可看大图

4 B7 k9 P: M! y( [/ ^
! G( u& j1 ~& G  R! ^+ W! q
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
* T+ u* J8 s: R* y% Z

& H( @4 K3 t0 _# Z% G0 u                               
登录/注册后可看大图
{//读取Xml文件,并遍历
& a2 z4 ?/ q0 \5 W- Y; I* |& A
* w, n' {& U/ P4 E6 v
                               
登录/注册后可看大图
    try- E* c$ P& p$ c! c0 Y

8 P/ l; D, v' r& q3 A1 Y1 A$ r                               
登录/注册后可看大图
    {% m9 T$ |. B+ s; }

% H# W  T6 T8 H! n' N                               
登录/注册后可看大图
        CString appPath = GetAppPath();0 z; H" w, _! R+ u
" _$ n9 t2 R1 ~$ {7 F2 s8 {# F
                               
登录/注册后可看大图
        string seperator = "\\";" ?, ^; [% ?6 U; h5 k( A* c# i
8 \2 ]0 d( c+ v. B
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;' I+ X" }. q+ X' p% K" g/ u
# P- B/ V, y0 R. S3 l  [5 @
                               
登录/注册后可看大图
        //创建一个XML的文档对象。9 ~! G; B+ C8 ?! h0 p

2 H! c, W* g% Q7 d' ~: s/ J                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());0 G6 ]( Y' N) }6 {0 ^
! `. Y' _3 k& |/ `  K1 s
                               
登录/注册后可看大图
        myDocument->LoadFile();
. k  b# Z. l7 U4 ~3 l  ^6 B' B

( X( v+ @3 x4 S5 E" w: B                               
登录/注册后可看大图
        //获得根元素,即Persons。
7 }1 ]$ l5 ]* {% `( f. Y

$ Y' _% [$ A; n! r' L' E/ M  n+ g6 O+ s                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();7 V; v. f2 g* x- ~2 f0 v! Z
3 B, i9 }9 R9 d& n; }
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。6 m- Y& [: l3 |6 J4 C: n

( g# c, ]9 I' y2 g" O                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
. a2 [6 ~1 e5 n! U! i
" K/ m/ _) n: D" M
                               
登录/注册后可看大图
        //获得第一个Person节点。
4 q5 ~  @9 f/ {. i4 I7 K& e
& k9 n0 k6 u: b" z5 q* K- G
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
! t. |- n7 b: y# L7 o. h

8 A% l/ Z2 e* e                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。% @0 ?. A# W6 C& x2 N
7 t+ i) \' c, o5 Y3 w2 m7 [8 l- Z
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();9 \) k# ?, X5 ?8 R1 n# d6 h3 g2 ~

  G! a. S7 _) ^5 ^) n8 |  O( @$ G                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
2 G8 p  ^! s. W0 m$ W4 Y
" y8 B+ S; L, |) S, u( M$ }5 U4 Q
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();6 T) O) T; E* J- ^% b
! W" h! L' P! M; D% E, I
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。# L( d+ M! H  m' _, D
9 _" M$ v, b3 c
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
! x& `! C' r+ ]: N

6 Q1 K, l2 z3 j: \6 }( V                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;) y% D/ g9 G2 m9 G

" I0 i2 P" Y8 @& m0 r$ q                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
1 @' s1 U7 R7 E* |

2 w) Y1 J6 W. T6 B  Y  Z                               
登录/注册后可看大图
    }
9 X4 Q, K. O8 G* B
/ Z" M  `! B+ I1 ]
                               
登录/注册后可看大图
    catch (string& e)- _, i0 j  r. ], K6 F1 ?! Z. t
5 v# s, z, d) q7 e
                               
登录/注册后可看大图
    {. |2 H0 ]! j  q! {# d
. b* P2 W) |0 P+ @8 G8 F
                               
登录/注册后可看大图
        return false;
# \  i' t, t* {5 {* x9 H! s
! ]# a  }8 W% i( Y8 {/ @
                               
登录/注册后可看大图
    }3 d. F& O0 n. F' N4 [$ M( X5 C$ I
  {, ~/ ~% b% m' r; d6 ?% g  \  k
                               
登录/注册后可看大图
    return true;
' t5 a: G( p; y! z9 a0 b' z$ }

7 {6 x4 p9 ^( s: k. S' g. k$ a                               
登录/注册后可看大图
}6 g6 K, ]6 B  X1 X

9 _+ m' K* h: ]: J: D! Y                               
登录/注册后可看大图
int main()
: a% `$ V& c  D0 e
9 b  J' n. }0 ?! f$ G& R+ W
                               
登录/注册后可看大图
{
6 x4 |$ [0 n! _

/ M& t2 x+ O3 l! M# v: c                               
登录/注册后可看大图
    string fileName = "info.xml";: {6 x: b$ H% g' ~
) l9 v: L$ ?2 I
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
/ v% h$ I6 v% L6 G$ t

* v6 Q  F5 _- G$ g6 ?- l9 }                               
登录/注册后可看大图
    ReadXmlFile(fileName);3 H7 Z  }' Q) W7 d+ ]

/ v( ~1 y3 O6 K" F8 g                               
登录/注册后可看大图
}
- R, z) ^: [, {  z
% c! S9 Q! Q4 R2 a2 g6 b  {
                               
登录/注册后可看大图
% q- Z1 r2 g( z/ W) M: E8 b' B
! _% |2 N) u4 E( P
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

0

主题

24

回帖

121

积分

注册会员

积分
121
发表于 2015-1-29 19:28:56 | 显示全部楼层
学习了 请问是从那本电子书转载的  6 x( h, C0 `4 q
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了