PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

mildcat 发表于 2015-1-29 09:24:17 |阅读模式

mildcat 楼主

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片段:
! U) I7 O$ t2 J6 z4 v/ y  `

4 {, H8 [, y/ j  L& e! r9 }" x                               
登录/注册后可看大图
   <Persons>3 A8 ?, v+ X7 b5 u* l

+ ?4 K( ~, _; s* Y" T6 M                               
登录/注册后可看大图
        <Person ID="1">) E  L) @" ?( ]7 ~& j2 E. y9 G
0 f) J. M0 B5 r# Y4 _. k& m! J
                               
登录/注册后可看大图
            <name>周星星</name>
. \7 D1 K; w  F9 A( V- O/ b

/ k% Y0 B" E' ^$ z" \                               
登录/注册后可看大图
            <age>20</age>. T  P( |# ~7 I. C0 I% w0 d

6 W7 M4 c5 N0 ?5 U8 {8 P                               
登录/注册后可看大图
        </Person>- p, C9 X# f: M9 `0 f- `( {
8 N$ O" V- ]! }
                               
登录/注册后可看大图
        <Person ID="2">
) b, F/ k( l& n
& J" z! ^; c4 F2 O8 j, `" u6 ]
                               
登录/注册后可看大图
            <name>白晶晶</name>+ A: @$ p  ^) ?$ G  y2 t
9 x/ z8 _4 r) P: m$ q
                               
登录/注册后可看大图
            <age>18</age>
, N: }) o$ J" i9 f
& L7 q3 _1 `! }' Y6 Z
                               
登录/注册后可看大图
        </Person>* t4 n( S/ x! G

5 _6 k8 W/ Z0 i3 u/ [0 v                               
登录/注册后可看大图
    </Persons>
, s: ?5 Z4 S$ Y$ G
3 M+ Z/ ?6 ~/ J7 n, p
                               
登录/注册后可看大图

6 B9 |, u6 W; c1 w9 s# i
在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文件:
5 [: N8 T8 m. M6 y9 q  B

5 f, m, c, K7 J) S) n- {* C                               
登录/注册后可看大图
<Persons>$ N+ s1 |2 B1 I+ \
2 O! C" U% _4 a2 y) }: i
                               
登录/注册后可看大图
    <Person ID="1">, D; {1 J* e* ~4 }

4 {0 J. p- j9 n- n; @                               
登录/注册后可看大图
        <name>phinecos</name>/ Y/ r! M/ z, s$ g$ @# Y

$ k7 B/ W7 G4 J! c                               
登录/注册后可看大图
        <age>22</age>! {) n4 q4 k! }
6 \$ @  j" }% t9 f8 q2 j) B- ]; U) Y
                               
登录/注册后可看大图
    </Person>8 k: \# @0 ?. a6 V' f' D
( s  k( \  a; p" f! \# Z: D
                               
登录/注册后可看大图
</Persons>1 T: U# k# b: N5 g6 P% q; p* p

4 w; u0 ~+ Y9 y, q                               
登录/注册后可看大图
3 J  Q( u$ b9 q0 T
读写XML文件的程序代码:
& N6 d6 J' E3 ]* @

2 z$ Y" G1 j  Y% `; ~                               
登录/注册后可看大图
#include <iostream>
. g" o, u$ V8 D* E: D7 d
& y, M( P$ d/ Q1 M
                               
登录/注册后可看大图
#include "tinyxml.h"
4 M& j/ L: u8 ?3 s3 m/ N- \

3 i' y. Z8 T0 [: _' Z' T) H                               
登录/注册后可看大图
#include "tinystr.h"
  _- C' \( l& w' ]! G2 X( @

* v% ~7 }& N, F, i" ^7 B, ]                               
登录/注册后可看大图
#include <string>
* f3 _5 q2 z3 q  ]# V8 k3 N

; f# O/ c, t) R7 g: q                               
登录/注册后可看大图
#include <windows.h>! C1 E1 A$ v5 k

, `  `( Z9 G% S- P                               
登录/注册后可看大图
#include <atlstr.h>
+ _# }  V! u+ \( d, a
0 Q( o$ g* H. W- ^0 w$ k( J3 `9 u
                               
登录/注册后可看大图
using namespace std;4 @6 \" E8 q' I
! K, G, Y/ @! V0 \! `
                               
登录/注册后可看大图
( g7 J, H3 j; F, X: Y( i
, Z; h1 F% w* I4 r% u& A9 n! X
                               
登录/注册后可看大图
CString GetAppPath()
& B( z% w2 l9 P; `. v) L
* e4 O0 ^* W, s/ p$ C  K7 R% ^
                               
登录/注册后可看大图
{//获取应用程序根目录% L" n" }% V9 p! T) z

; t7 R1 b9 [. D$ e. z                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
0 f, z$ ^0 y6 I& n
$ r. s" ?: e: y. N/ R. U3 w* m  C1 S
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
3 X) e) O6 _9 A4 V+ i$ c# O1 ?
; y" B7 ^( S, S3 w/ q
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
! T1 ?9 P7 ^/ e$ z6 i' `  ]
6 t* ?3 N( J5 @8 p
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));! ]4 e! w& r; Z3 d  }3 [

5 J8 ?$ h3 V5 @; a: j2 O& _$ W( H  _. s                               
登录/注册后可看大图
    return strModulePath;0 U8 @+ m9 @, h8 `; E0 |6 y
, {6 G/ Y( t$ l) F+ L8 [# W
                               
登录/注册后可看大图
}$ B7 M, Y4 F: v4 z
; N* R; {# d( m% d$ R4 @
                               
登录/注册后可看大图

  T3 K0 R' y; a4 U( N& u
8 _. H+ y; N! S0 i7 W6 o* U& P& v
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)/ q' R& A* i0 a  V$ T7 F. f2 `+ P
* t1 a+ A  d* z( Q4 {4 s
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false/ b, _9 B, H6 ]9 b9 E) }
5 u  w! k, c- a& }$ b1 B" P& Q
                               
登录/注册后可看大图
    try
$ W9 G  L0 {4 A0 ]% q
" ?/ K+ V. R* h8 j. o2 y5 N
                               
登录/注册后可看大图
    {( d9 q1 q& R# u1 _+ e4 ^* V% [

* }5 s1 z. t4 D  ^: w* `$ @, f                               
登录/注册后可看大图
        //创建一个XML的文档对象。; g9 C; _6 K$ h
% P) n! U  R$ l
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
) e! l  r$ g6 J+ Q0 U+ X
* c: F6 L" |- ]. ]! s7 }
                               
登录/注册后可看大图
        //创建一个根元素并连接。
  [; C+ w) R! L( d

( m% k$ a& o* ^8 T3 y$ Z8 |. w                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");( S1 P* |$ E  R( Y

& H8 Q+ G# [5 _- h0 h7 r                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
5 a  B/ i1 x" S9 h

3 w1 j8 O% B/ u0 b: l7 z                               
登录/注册后可看大图
        //创建一个Person元素并连接。. c/ r- ^1 u0 \; l+ T

) a4 ]4 C9 U4 P. A- Q1 m' Q                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
1 P' ^# H3 L/ t9 l& Q- B# y/ _3 V
+ t9 O/ w5 K' c" Y8 @
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
. p$ P; w$ i, W9 x4 w
( a. U" ^% ^( o
                               
登录/注册后可看大图
        //设置Person元素的属性。
' q7 h5 E+ {3 U8 Y

0 f" l# A3 V& W; _' _, e( k                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");. _' B, {  F8 P2 ~! P0 q3 ?! y! k

- R$ d1 I# f% h+ l9 M6 V% y                               
登录/注册后可看大图
        //创建name元素、age元素并连接。8 `) R' d, h+ q8 S" r3 A" t* Z& l

5 f' U, U) Y# X. ?0 v1 q, [                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
, c$ R, p* ]0 U8 j5 k  Y
1 Q: E3 r" |. C
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");5 m5 b1 `* @0 w7 Q6 e7 d: f% B- r
0 T0 C. d4 a5 M/ H! X( U0 p( u( r
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);2 j- ]7 l8 D1 t% P3 M+ d
' k# S8 W6 F8 U( O: @" e6 \
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);/ Y5 M6 n% O2 a' S) k5 x' y; P7 S
; K% N/ N# h. B, S/ x4 ]0 K  f. N; R
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
! M: b% o  z, i" E/ _

- k$ g6 E/ c& A! s- v/ z( @" a                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
. A1 d0 F0 U% K6 J8 m( e) Y6 O

: e3 Q1 `, v: P" C0 ^3 d                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");) o" X2 D; Z7 @6 z5 E/ \

) e" h. g  l! Y                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
& T6 @7 U( v) p9 I; ]

& ]9 f& s6 U% E) h8 H! h( y                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
5 A3 b9 {& [" s! f# c: Y

- u! O; ^2 e" s1 M7 L% w7 H  A                               
登录/注册后可看大图
        CString appPath = GetAppPath();- K9 A3 B3 d* y4 j* y& H
- Z7 e, ^3 f1 `/ R" t8 s1 E+ E/ a& A% B
                               
登录/注册后可看大图
        string seperator = "\\";* E& n. E4 C9 X0 D. d$ l
9 o1 r* G$ m& ~' y& B
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
3 z- F' k- h4 Y0 R& T. F

& A7 P) s) k" ]7 D                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件) G* ~3 j4 S0 F+ S" ]

8 y5 i$ f. o: a2 ]0 ?3 t/ w                               
登录/注册后可看大图
    }
, V# X6 @5 _( `  }/ ]0 P8 V
9 _5 G/ A3 ?: b5 @. K
                               
登录/注册后可看大图
    catch (string& e)
& X8 x' t. @7 k% h! n3 @
; v- M+ U. k' f) [, w' c$ y3 s
                               
登录/注册后可看大图
    {  S) ^8 y3 M$ Z8 d# o3 G

/ o1 r/ C9 `! X; O" C. D                               
登录/注册后可看大图
        return false;
; D9 k. B6 r6 h7 B
2 B6 j. Q. P. A, H6 y
                               
登录/注册后可看大图
    }
% ?8 m( w& Q- L6 x" z4 Q- h$ H3 S
- O7 ]: z( m) \! m+ V; H! \
                               
登录/注册后可看大图
    return true;
# B+ T; T- I) C2 O" R

" e" V/ {' j( j( Y, ?6 z                               
登录/注册后可看大图
}9 ]! k! w- W6 Z5 P( J3 L7 A7 P
* ]9 N! v, L- E; B$ a9 C( k7 `
                               
登录/注册后可看大图

3 m! l0 n9 ?) b
  n! D4 u* ~+ |) {3 F& Q
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
, }. e8 K" l5 \% \, z# {; o$ w
; L2 R) n" t* f# L
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
& G% t7 ~- a# L: q: Y) N' g
8 g1 j2 J1 k5 B/ {# m1 |
                               
登录/注册后可看大图
    try
: o+ }' i) k: w6 H; e: L; d/ G
. P5 f7 X' _+ h  a2 r9 H7 K# A
                               
登录/注册后可看大图
    {
8 J% z: q$ V! j! j. f, I+ h
' s; |; u% x& a1 A8 T# c+ y
                               
登录/注册后可看大图
        CString appPath = GetAppPath();  I4 e# u' Y, p6 E; }

8 _' ^% f! @( D. M+ R. j# s2 J                               
登录/注册后可看大图
        string seperator = "\\";
, ?# R7 q# N' ]* ~" L4 T
! C/ F" {5 n+ t% B0 [
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;/ ?" s$ o; r9 U! i

4 ]: i% p" r5 w. Q7 J                               
登录/注册后可看大图
        //创建一个XML的文档对象。
) r+ r6 ]6 W* e# [' ^6 ^/ ?
5 g! C8 L4 K& B5 @' `% u: Z6 R
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
" O) q9 s0 Y' {2 g* M
/ h% H8 \7 t5 Z8 D4 v$ P
                               
登录/注册后可看大图
        myDocument->LoadFile();
# P) s) y7 z& w

. L0 z  @; J5 Y8 W% }8 ?, r- Q9 _                               
登录/注册后可看大图
        //获得根元素,即Persons。
( n4 z6 o* K; I

7 s0 U; G: ^! H: t7 b9 j                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
' R% h0 }# w2 S" T7 a8 Y8 x
' {+ A8 k0 @3 E
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
# P* {5 \% f  L' M1 i" I
3 A5 ]% N6 H1 U# A# G& o
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;# R2 J8 U# [5 o! t5 o
$ J- s6 ^) ~5 d" q0 i4 L/ i& f
                               
登录/注册后可看大图
        //获得第一个Person节点。8 ^( F4 ~3 I7 F
  y% ^6 \. Z* p  `; j
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
, h& r: _; R' q. D- \

8 _0 T0 I7 g+ r7 U. ~                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
3 |' K4 w/ m' r! D, `5 u0 q8 x$ y
$ {% T, d5 a+ U6 t: Q0 o8 P
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
: |9 f0 s3 Q- x# u- E

- t  s) }& L  p                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
$ e" I! F# A* @! g) n( m9 p
6 G5 A/ j9 P$ V% E, q# W4 g. `
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();" M3 p6 r" V& m4 J/ [

! G5 ]/ p! N/ e5 d( M: [                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
0 j0 Z/ D: _( o3 J; g- A) H
/ z) l! u  F- {# ~$ @
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;% T% G8 W& B' ^+ n* u( x& V
. p. x9 z$ m0 D, ~* m
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;. O4 h5 X; r3 s) l: z" }

6 g9 Z  K  j* @$ ?# b                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
( k- e/ r& v& Y) l% ^! L
; j0 R! z* h. e! ?* ^
                               
登录/注册后可看大图
    }$ }: W* w6 Q! k+ ]
$ j+ L6 ^9 U2 W
                               
登录/注册后可看大图
    catch (string& e)
$ A# _' ?$ H$ }- g9 K
/ J" e  n* T$ ^0 {# i8 S" Y
                               
登录/注册后可看大图
    {3 D8 l. ~# c2 [. w

/ S* g; R) z: ^0 l% y, s6 L, ?0 S                               
登录/注册后可看大图
        return false;& p7 e$ h' \& B" e1 S

+ k/ X* E, O* b$ v9 U' d                               
登录/注册后可看大图
    }9 R6 y+ Y) q) R6 j- k3 v
0 r+ u; c- ?  U# i& C
                               
登录/注册后可看大图
    return true;( N( h( e# q' M; Z3 i/ `9 K' v
- }! }2 u, a: E7 h
                               
登录/注册后可看大图
}% w# ?( X  d6 q+ T

' ]7 F- Q6 Y. K3 e2 G* X' }                               
登录/注册后可看大图
int main()
: Q+ A4 |% r! D6 z7 F3 g1 F
3 K  c9 i0 f8 j
                               
登录/注册后可看大图
{) t  t& v+ k* p6 [4 A, {
/ r, O0 c* \4 M5 z
                               
登录/注册后可看大图
    string fileName = "info.xml";. }: g, T/ E7 f% F

* A" {* K0 j& E0 [- u                               
登录/注册后可看大图
    CreateXmlFile(fileName);
" o$ W! q/ Y+ M
4 x1 B- T* t  B! n) w( H+ T
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
+ i& ~& w5 Y5 a: g6 P! O. k  n; i
8 v+ h& e6 k$ _
                               
登录/注册后可看大图
}
6 _. w$ N4 V7 }. ~, y4 K
% W$ d& A; a! k/ d
                               
登录/注册后可看大图
, m1 t/ _$ x2 N* `

/ D4 ^3 }* O: I) F+ R
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

magic浪漫 发表于 2015-1-29 19:28:56

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的    N% ~  O3 w- S6 k( g
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了