PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

2015-1-29 19:28:56 4542 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片段:$ }& p) ?$ a9 o3 X
; c1 @0 ]: X8 c/ \6 A8 \. Q7 ]) ^
                               
登录/注册后可看大图
   <Persons>2 ], \- Z* D4 }' I+ e
; W9 }  c+ ?7 F
                               
登录/注册后可看大图
        <Person ID="1">
3 n5 a! v/ B3 j6 I/ D. N- U' D
) Y& B, L1 B  m% t5 d- r
                               
登录/注册后可看大图
            <name>周星星</name>& U2 _: k) \7 D8 p; d& V

& G# N% X& {8 W: @                               
登录/注册后可看大图
            <age>20</age>, d" N" ~/ F5 Q4 G
2 P& L! G, @0 D& b- I
                               
登录/注册后可看大图
        </Person>$ i$ h7 {6 W+ x6 i0 w6 G

8 u6 D1 h  I5 ?  ^( |6 c) y                               
登录/注册后可看大图
        <Person ID="2">/ v2 @7 W) R7 C6 Q

, y- j3 @8 p2 R' e. L% m                               
登录/注册后可看大图
            <name>白晶晶</name>  N% f, R* X7 p% {! F; _
+ h7 ]  `9 Y7 N7 ?' e/ r
                               
登录/注册后可看大图
            <age>18</age>
- u$ _' b$ m8 D! b8 m

: s, f( _9 ?* p# x( H& _1 l" N                               
登录/注册后可看大图
        </Person>
4 P* Y# j6 g; \$ B

3 K% u/ h2 q: U5 x6 f* [9 k' c                               
登录/注册后可看大图
    </Persons>
: K( P4 X: h& @2 P

: k4 ^  G- ?7 [; |! t1 z9 L                               
登录/注册后可看大图
' }9 B- a* q; E5 O$ b/ Z2 ?
在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文件:
7 H8 b2 \- h2 a0 J$ r: P# ]

/ K% v8 p3 {& F& p5 B. W                               
登录/注册后可看大图
<Persons>
  }) M' l7 n: Q1 U) o# }+ h* u$ Q

) C! S6 M8 v' x$ o& K/ }' ^+ N                               
登录/注册后可看大图
    <Person ID="1">+ p7 J5 A3 u; X) c$ Y

2 B* C- T( ]) o" T' M" `, x                               
登录/注册后可看大图
        <name>phinecos</name>* k3 e- p7 d2 @
" G: k7 c' C- z% e6 t; p
                               
登录/注册后可看大图
        <age>22</age>
' @. t+ M5 j* p9 h, q
3 u' h! z) g* s5 _
                               
登录/注册后可看大图
    </Person>
; _6 U8 G; a$ y" V! R) }; o

9 W- [8 a7 J1 m+ n                               
登录/注册后可看大图
</Persons>
! f! d% N3 [6 F' F

8 |) x- E0 K! M                               
登录/注册后可看大图
2 x. O/ o7 B: w: m8 }7 k! E
读写XML文件的程序代码:
1 ~1 u3 d2 c# S+ q3 G

  z+ a2 H4 v& U* b' v( R2 i" Y                               
登录/注册后可看大图
#include <iostream>, w8 o% L% x% T& N
( t% Q! W3 G$ T/ ?" J2 g. n- r3 C% H
                               
登录/注册后可看大图
#include "tinyxml.h"  f' J" b  j5 s
; G: k" Q' ], X/ j' O
                               
登录/注册后可看大图
#include "tinystr.h"
) U, _) ]  \' s+ g
) C* p0 i0 {  H" F% j7 H
                               
登录/注册后可看大图
#include <string>
7 V; O- j9 _- T$ w5 e2 t' v" V  x

  r6 g' Q$ S8 E  O+ T# V                               
登录/注册后可看大图
#include <windows.h># [' z. q$ o# X
( F% \* M) Y4 l, m9 b5 F* L& j
                               
登录/注册后可看大图
#include <atlstr.h>( Y+ y* p8 r, ^( ]

4 V1 {. y% o8 L                               
登录/注册后可看大图
using namespace std;
) }" `/ C- ?7 W2 m4 }& F
% ~1 w6 \2 i/ J  z+ Z, i
                               
登录/注册后可看大图
4 b: D4 z: m( P; |! L

( m" k5 h1 L: ]- I3 o9 B/ M                               
登录/注册后可看大图
CString GetAppPath()( I4 p$ O* L: Y! w+ f8 k

! R) v4 X- Z& A7 j1 N                               
登录/注册后可看大图
{//获取应用程序根目录9 Q3 N: i, _+ |) t7 P4 h( q, L( \
$ k, V' c  Z: X2 O
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];, y( }$ e2 K7 s8 u! ~. d
  c# s$ t4 M% p2 k7 u; P4 p- d7 z
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);. ?' h7 G- a* J( ~0 z. I
7 M9 s, c! G4 l; @
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
: a9 e+ z. R' @( D) q

7 Z0 s: A! s+ Z6 s                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
$ q7 k. _, U4 h8 E# e1 j% k
8 h, J$ g6 Z' R. d+ _2 s) S  x. X
                               
登录/注册后可看大图
    return strModulePath;
1 z/ o( i' {0 C! }1 M7 K1 m+ z5 t. D
; \( h2 L; z; E2 e$ |& q
                               
登录/注册后可看大图
}
1 X& m/ k1 t+ X- x
  d6 ^! X/ e1 H& ?7 k" P
                               
登录/注册后可看大图

) b/ V" n; W2 J, X4 S% f
8 U- `$ _6 q$ E/ S6 Z+ Q! g. N8 ?
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
5 ]( I3 d; |8 P# z, b8 h& f' @: \

; O( ^2 G) b7 Q3 l1 W                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false- Y: n- h& m0 d. v1 x' a, [+ {

" {0 q" _8 C7 G- ~% l                               
登录/注册后可看大图
    try
# k- O( ]# t' [- Q; U6 Y/ o  Y

. Y/ |/ o$ Y4 }, J# W8 r3 K8 K! p. u: P                               
登录/注册后可看大图
    {
8 p* Y0 J) U3 l. y6 \& J; F/ J
9 k& U, h! C4 Q. O( j
                               
登录/注册后可看大图
        //创建一个XML的文档对象。& g. X5 f% j9 G; x5 L. L8 E& W
3 B9 L$ o8 o. F# f# q# j0 o
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();6 W5 u+ o6 T2 [9 F" P2 v

! T% c/ `) d" a* h                               
登录/注册后可看大图
        //创建一个根元素并连接。
1 N4 F- G# N1 _
" `5 B6 k9 ]5 j- B; E
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");& T, ~2 j! T) j- L- w4 s

4 Y2 P4 S8 L" _+ [" o" Q                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
) H& L, k+ I3 ?5 c6 D
4 V. i7 i1 _" d" F! o: t$ Z! B4 ]
                               
登录/注册后可看大图
        //创建一个Person元素并连接。- f  i8 t% o9 A1 x# ?! e
2 L& Q6 f8 `1 K) u* Z' z
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
! a9 T, L% r8 y. l3 v8 q5 J0 `. q

2 p! v, Y7 _5 g  ~# W8 V3 w                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);) _$ S/ U: ]' x5 e. R7 F- k

8 x. D+ t' n! d0 L% Q( R( T9 O/ E8 F                               
登录/注册后可看大图
        //设置Person元素的属性。3 x0 n9 ]& M+ }1 F5 i: `8 o- O* |

9 F7 ]1 Q/ P# h. W                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");& T6 [3 {( u8 e$ Y/ I7 G! u

) M6 w2 B7 R1 e8 X                               
登录/注册后可看大图
        //创建name元素、age元素并连接。, O$ `% q. n' v# a# S, U% _

6 r/ l; F+ @+ y. ]$ S                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
1 C1 n2 p1 Q0 ?# r. Y* j! q
0 s1 j; I: \3 K; r
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
" x0 k- Y$ k; v" h
0 r1 R2 T" J  ^5 D. P5 y( y1 [. U9 b2 ?3 W
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
4 x( [" |6 y" V0 Y7 o' Q9 x* a
5 T8 {- o$ o: l, C" b$ p1 P& b  x
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);6 f' w; {6 H: @7 {& x& a: A
! D* L# e6 [+ g0 ^
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。% G; R- U7 ^' Y: v) C( V) \
" X6 S/ P. v; h1 _# E$ C; i
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
) k1 A) e7 F6 X2 h* I  E
1 m+ f. n3 p4 {; w1 ^
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
2 q" a, j& f' j. A
$ a+ ~  }4 {! y
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);. ^  B8 u' P! q0 W! [1 `
+ I  g& J" ]" @% y9 ^) [/ N5 L
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);3 N# R" ~, B: g- ~; Y1 c

0 B% u. f8 ~2 U/ H; I; p! _- [                               
登录/注册后可看大图
        CString appPath = GetAppPath();- z2 f  V- J5 {) C+ r4 p
# U, T' o7 P0 ?1 t: B
                               
登录/注册后可看大图
        string seperator = "\\";
: r' H: M- H' E! p% y( g* _! a( w' M
8 P, E2 \* G3 m: u% |
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;: ^: N9 d4 Z$ j$ K$ C5 c/ `( n& I4 ^. j

! q4 I: f% I% _' Z" \$ E2 J# }1 N                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件( `' z% U0 u* {$ [
! a% \' D7 y4 G" c- s. L
                               
登录/注册后可看大图
    }# z- t* L7 E% j9 C' e! l

/ O( ?6 e$ M( e& p2 m                               
登录/注册后可看大图
    catch (string& e)
( \6 U1 b: V4 u" }9 [
$ {& s* Z8 ?; @4 |! v/ k8 d2 _
                               
登录/注册后可看大图
    {
3 h: E/ y1 S. _* X/ F4 ^0 ~
0 b9 m. B1 @5 ?8 \; O
                               
登录/注册后可看大图
        return false;
. H6 m6 l8 I; |) v" C, b6 V) a

& c: o8 M; H) w+ s2 s8 e& L                               
登录/注册后可看大图
    }
, r) m. g! c: G  j, d8 N( R8 |3 _' t

0 X6 J. R7 h1 ]- B                               
登录/注册后可看大图
    return true;
. ^: U5 p% ^2 m4 {0 d  M. v: h" z' S

- b; C( {8 k  B" y% `% U  o& J5 B                               
登录/注册后可看大图
}
+ ^7 A" P4 Y( G6 Q6 p7 k

) T+ R  h3 W& z8 X) {                               
登录/注册后可看大图

! _9 X0 @& R7 E$ p/ K; K

# U6 c5 T, m! f, n' B% A                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName). [6 o! R2 c* M8 G2 L  v$ |! {
" G+ t8 J* u0 k  l, t
                               
登录/注册后可看大图
{//读取Xml文件,并遍历) [* m2 M" P4 e) ^
# I5 L8 h0 a6 X
                               
登录/注册后可看大图
    try
# N; {: r3 e- T* g$ t& r) a, w
' {- l: A/ V0 A/ g6 V
                               
登录/注册后可看大图
    {
& u1 }( ^3 M: s+ q6 w3 C

6 B9 F/ J% x! N( T7 J0 S" V                               
登录/注册后可看大图
        CString appPath = GetAppPath();- p+ F! F! \. k

( V: ]  n+ l, ^6 b6 q                               
登录/注册后可看大图
        string seperator = "\\";
  A! u( _! h+ h6 m. z3 u* h$ F
. F: A! U' h" y
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
$ l; \& o5 e8 ~: o# L  G% w) n9 P
5 u) ]/ l; @( E7 W8 q
                               
登录/注册后可看大图
        //创建一个XML的文档对象。2 d& s" B4 a8 I/ o& h" S
4 [1 V7 I2 p2 G: B. o
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());1 |4 ?1 A# H4 |- A' c' z
$ o) Q& b( B+ z$ H
                               
登录/注册后可看大图
        myDocument->LoadFile();/ \( L3 R& n$ O3 ?

6 N3 Z6 {& U4 _4 ~. u# ^# z4 o                               
登录/注册后可看大图
        //获得根元素,即Persons。
$ ~& m+ W3 e, s0 _% @+ J
# {$ n- ~. G8 A$ d! F2 G$ C
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
) o2 V7 N. W" P# g
" z" D7 V% b2 e$ {0 Y7 @
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。* t/ V/ N5 ]( y$ M+ G' u

. U3 q6 c  ?9 Y: P& @                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;+ Y: M5 c- B- O8 X7 m, v+ B' y! d

7 {7 A  r  o) @5 d- \- C                               
登录/注册后可看大图
        //获得第一个Person节点。( e: R" ^) S; K+ ~2 F/ w

1 z% V' a+ c/ X* J% W                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
) r- ~! K& W+ X9 [( J, ]% R4 d# K
$ {8 J7 @! [' X2 B1 I
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。+ u) O0 k6 M& L# w0 T* c1 ~
3 \6 Q8 @* C1 _2 t" d/ o9 F/ w
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
7 _- t# F  c4 q% U; g5 W5 b0 c

# T3 ~$ K3 I' }3 K* E                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();% k2 I$ Q4 g4 g- {6 H, s# l

2 M& L" J% n& b$ [: d/ h4 J                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
8 U: ]6 v' \- Q- M
  Q1 {1 d6 j2 Q! C& b! O( f
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
" a4 u- R7 u' }$ f
" P7 v! i$ }1 m1 ?
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;% k( T7 c. M* G0 _  Z  a

4 V  M) x/ l! K( B                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
4 z3 v& W: o1 K/ }8 J) p7 u

% c  l: h7 j! L2 E; v. a: L+ w                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
- D; P# Y4 }( ^( n9 K

, e2 N5 ~1 l5 t0 Y                               
登录/注册后可看大图
    }1 h" H/ q, m, I5 Y0 \8 T
5 r1 \' d' V/ U3 e! ~
                               
登录/注册后可看大图
    catch (string& e): t. ?. a- \9 [" q, @

4 }+ f) \& s( ?# a$ Y* p2 q# I                               
登录/注册后可看大图
    {5 D. ?$ M- a- B: ~& t, s

/ I3 t" v0 L! ~) v4 u                               
登录/注册后可看大图
        return false;
/ {5 i+ y! J- ~- F* M8 [

; J- ?9 V5 L$ J1 C/ H                               
登录/注册后可看大图
    }
  j+ M; A2 o+ i) l# ~9 M+ I  O& |
+ N1 }7 R. n/ ?; q8 I/ U
                               
登录/注册后可看大图
    return true;
: Z% H5 `* S8 k, e7 @, o- W
/ g7 E* n1 A  j) {. e6 B
                               
登录/注册后可看大图
}
5 G0 J$ ]* P+ o) C9 h- B) y% m7 a

' t* s' Z& h9 _$ I+ |) x                               
登录/注册后可看大图
int main()
0 _/ }9 g$ ^" i1 a
- z( k4 d- K+ J0 E/ F9 q
                               
登录/注册后可看大图
{9 _) i2 S- D' _
4 V. u$ k" S. ~: [/ Y  `
                               
登录/注册后可看大图
    string fileName = "info.xml";
; |) g9 |4 V. |- G: M, m, z) }; k: v

2 j0 ]5 R5 \2 `+ d                               
登录/注册后可看大图
    CreateXmlFile(fileName);
' A4 T* Z* s8 K! F+ m2 p/ ]4 |

' h& h- Q& q7 n! T: X                               
登录/注册后可看大图
    ReadXmlFile(fileName);& i. b- e: h9 y5 h# a3 P9 T: l

! a4 F5 _  @1 P                               
登录/注册后可看大图
}
6 G) D9 t7 l/ j4 H" e" C

5 X! t# M8 x' Z+ A) ]4 D; \                               
登录/注册后可看大图
- n  p5 t9 Y5 ]1 d; s: j1 W' k

4 h; N: z; |% T: z( y# ?; e
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  ; P* W" X4 M7 M/ t
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了