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

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

[复制链接]

2015-1-29 19:28:56 4630 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片段:
1 d" p- t7 M: b- W9 e% F' z3 `2 u  X2 I
) y- G9 r2 G; z' d
                               
登录/注册后可看大图
   <Persons>/ [. d# p6 o3 l0 S& Y# O0 x2 t

- k' b- }; W/ t. k) P! C                               
登录/注册后可看大图
        <Person ID="1">' O2 c$ E  N! F8 o! W! K& O+ q
' z8 D/ e* X) ^7 {
                               
登录/注册后可看大图
            <name>周星星</name>2 }) ~: G* y, M$ X8 `, g. n
- ?: r3 `  ^) Q4 d* c- i
                               
登录/注册后可看大图
            <age>20</age>
3 c& y! Y7 ]% G$ h
! p' c, ?! g) v+ x
                               
登录/注册后可看大图
        </Person>1 J9 i% }+ }  L  @! ?( c1 V# v. B- w

$ F) o$ C: N6 ^% o: L                               
登录/注册后可看大图
        <Person ID="2">  S, l  r) K9 I, R7 e
! ]: X* s% N) [/ L4 W) G; I. L
                               
登录/注册后可看大图
            <name>白晶晶</name>4 N3 S' T2 D( b5 ?& h1 B
3 b1 D! m, O+ y; `% F
                               
登录/注册后可看大图
            <age>18</age>- }, E0 F0 j6 V( k  ]# N! _
1 x$ |' K9 ?# O/ B
                               
登录/注册后可看大图
        </Person>
# ^8 p( [+ v; y& g" b& D2 o

$ b9 n1 r$ p; b8 Z: L. K* x0 U                               
登录/注册后可看大图
    </Persons>
& Y2 g2 f( i2 W% F

/ @. t' b$ r4 Y7 R) Z7 n                               
登录/注册后可看大图
+ U4 I9 e5 _, D; d5 Q
在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文件:# N. L2 T- r' B# ~& l, _6 f# m$ m+ ~  J
: [3 e/ I( b! O7 o7 F: W7 Y2 c
                               
登录/注册后可看大图
<Persons>
2 X- c- M0 p: a" w6 T, i8 p

9 x0 H9 o0 [" W# z3 N5 @( P                               
登录/注册后可看大图
    <Person ID="1">
! I! j! V! F* b4 R$ N. ^5 F

* q+ Z4 ~) N) i( u& L                               
登录/注册后可看大图
        <name>phinecos</name>
- L0 C( ^* K+ K  Z  t
6 b% j" W, Y) q( ^
                               
登录/注册后可看大图
        <age>22</age>& h. w( |# N$ ?) h/ X
/ {  Q6 U( _* `' n4 o% q& l' |7 d
                               
登录/注册后可看大图
    </Person>
6 h' r( ~/ L/ `2 U4 x  }. W8 w

+ P. o% b) i: z! u7 D) V                               
登录/注册后可看大图
</Persons>2 g% c9 m! Y, n7 I
. C  U- j% ^/ ~) J
                               
登录/注册后可看大图

! \/ g4 B( y' I. |" a; Q& G
读写XML文件的程序代码:
+ s6 m2 A! K( \- [3 n) y& N  F
1 J( ~" v( I5 o6 W( Q' l
                               
登录/注册后可看大图
#include <iostream>4 I( i$ t+ E2 L

+ }( T2 J0 n. I2 Z                               
登录/注册后可看大图
#include "tinyxml.h"
. M. i7 u& t0 y2 ?! c; F

5 g" q+ }2 ^# L                               
登录/注册后可看大图
#include "tinystr.h"
1 [+ N6 h7 F9 m* M. Y

6 o4 k9 I" g2 y( i' Q' [2 m8 n                               
登录/注册后可看大图
#include <string>- q% p1 z9 m- h" \, T9 B  k' }
2 z; e& |  i& E( Y4 ~& U. y
                               
登录/注册后可看大图
#include <windows.h># \+ Z7 f3 {) Q- b/ W0 J
, U2 D( p0 [4 d
                               
登录/注册后可看大图
#include <atlstr.h>6 q+ G. u3 ~! C, \

! W) o2 F) N, p! C6 [& ]                               
登录/注册后可看大图
using namespace std;5 D6 `1 h5 m; K. l2 {

( S* ?  S  `, h& i6 m! w% D3 m                               
登录/注册后可看大图
% c; n1 B9 x" G4 @8 j& S

# y, H: X( o' t: Y                               
登录/注册后可看大图
CString GetAppPath(): R$ J7 E' P0 Z" `1 \$ c
1 f8 ~& e! w* }* P' t8 E
                               
登录/注册后可看大图
{//获取应用程序根目录8 n) k9 ?# S  c" }7 n
8 o( p0 V2 f6 f
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];1 ^2 `6 V8 j9 V! f
/ }2 N. N" b/ C% Z
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
/ A/ _/ e) {" C: J: g7 z+ B; M7 }
; n+ l# ^& y+ E% V+ H, G5 G
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
1 N6 r- j. f0 G# K4 ]# Q4 a0 S

6 U1 n6 ?$ b# a3 ]3 I& \) l: Y# ^                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));5 X' x; v: B+ f% m4 k

' X5 o! b1 b: f/ f7 V                               
登录/注册后可看大图
    return strModulePath;$ L" }! |4 w# \+ s
1 ~4 q, R( x( S  ]) a# {4 {4 P) Y
                               
登录/注册后可看大图
}
. F0 J# L2 z; W* Y

5 H; d0 S2 E! x3 u- u+ w                               
登录/注册后可看大图

6 l" A0 w  l/ v$ p
' y# h/ G, K5 h7 w( p. @& }& @
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)0 B  `' w$ V5 y) O  \% ]7 [
. o6 S0 T' m/ `& t, d7 m
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
: L- N6 o- B7 V* v$ j5 G8 i

; z! F, e: t( x: b5 O) R9 A                               
登录/注册后可看大图
    try
! f) v8 e0 P9 U/ h: H  G# m

& G2 R( Z1 e& X- Q# n6 Z                               
登录/注册后可看大图
    {' s" `! q2 _( e' D4 E# Y! O
# k4 r$ G" c* r$ k: v
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
4 i. R6 M! u" ~/ D

" M' s& z; d- _+ e- G$ ?* o% e( i9 D                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();  Y1 p5 ?2 J$ {  c1 v& X- C7 U

0 B# q$ A" ~" G: V. A) j  J! B$ ]1 a                               
登录/注册后可看大图
        //创建一个根元素并连接。
, r9 s/ e8 W! ^7 h8 E( c
7 ?/ i* f( I4 a& i& _; ]
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");9 j3 R5 O, `( `. O7 W: M' |, w

8 Y. i4 S( V4 z' ~2 w* v  J/ o                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
; U! ^: w/ I) F( n& f5 n

; p1 K- [" ]: A+ y( v( i                               
登录/注册后可看大图
        //创建一个Person元素并连接。: n* a8 i0 g; d8 x

9 y' G  U" O6 x  h                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");$ K" w6 ^5 L( ]

# i* f2 C' Y2 O. k+ \                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
, \+ k  }4 G# o9 R/ ?( t

4 [7 J7 Z/ t. W$ c2 ?                               
登录/注册后可看大图
        //设置Person元素的属性。
  n. J* q% ?; ^! K+ Z8 I+ _' l3 \

% Q2 ^$ r  E) C+ v* w& F4 v                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");. L8 }' W0 w) J% {* C* q  |. B
# s4 h9 Y3 V4 ^( h2 R: O
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
4 c! N& F+ t: {  j

( s2 l1 r" r* l5 ]                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
2 u  {8 u  }8 [8 ^  O' N
' [. e* x: F; p; p" M
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
2 r9 F1 M' k6 A7 H# g9 Y5 b

- A2 |% J0 e& o( T: h7 [                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
) b- t: X* s9 G3 z& V+ J

. }6 Q8 U! c% F4 }. L                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);8 b; b7 V' h7 y3 k
- _9 ]" p# ~, Y# @$ ^3 d
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。- Z" ^9 ^( E7 G1 @6 k7 a
, Z; y% m% z1 Q4 R7 I4 [
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
/ T6 Y  I; _# |" E) `

% x7 b: R& w" j  H7 n8 h) T                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");5 g! s3 h: c. u: G  F% s
& ?+ c2 j3 S, c- w
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
: K& u0 K0 N' y( N+ m

# x; E. ^/ {3 o, h! m% [                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
" [3 e7 s5 ~. |
: n& Y6 _7 r8 Q
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
# _/ V6 `. u% j

; Z& _! \' R& b$ w                               
登录/注册后可看大图
        string seperator = "\\";2 Y8 j' t" P) k* P- L: {( m
6 K& U6 X8 S! [; J; z0 a' p/ ^
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
# f% R1 i% j* S+ ^/ H
& s: F& t  G/ P( y- U& x) A
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件4 D% r7 c* B( i: B

% C  q2 I  m+ i: |) M                               
登录/注册后可看大图
    }; a$ @/ Q* T, A4 P
) h" ?# E& S2 G7 R6 ]/ f: D9 u3 Y
                               
登录/注册后可看大图
    catch (string& e)' F! R1 R, t6 W( P7 O
9 |# K9 U" r  a8 L$ _
                               
登录/注册后可看大图
    {
3 z# R2 d# ^% _( \- g; F

; _6 r: V) M  f$ |4 y* q% f                               
登录/注册后可看大图
        return false;
) G& X7 }; z+ h
2 D$ A# m4 R3 J
                               
登录/注册后可看大图
    }
: N4 h( \  L6 h  J* R

' Y) m' S2 {6 g5 ]- C# v4 R2 a" \                               
登录/注册后可看大图
    return true;
4 L4 f& q9 ~* d/ o+ k2 F) Y4 D& H

0 e" b) @2 P& d3 u# y                               
登录/注册后可看大图
}% V, ], H$ y' X/ r6 [
( o, D! G  R( P, G/ f$ C
                               
登录/注册后可看大图
9 W# r0 a; G# \- @
5 {$ h* k; K) X* _  U  t
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName). r& E/ U* {8 q" r8 N6 T, n3 ^
7 q  N/ l/ b3 d
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
  C/ k: n8 F! q- W
9 n" t* b$ u; M7 f: h
                               
登录/注册后可看大图
    try' S2 P5 u" S& o' o% t

7 A! {* l  J+ Q. [4 d                               
登录/注册后可看大图
    {
9 T3 P# \2 J1 w' e6 z3 B. ^" ?! S
7 O& M* S; A5 f9 N/ M9 j! l
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
3 F3 J6 d/ Q5 ]( \4 r( c

' M1 @# Z( c8 y, S3 {                               
登录/注册后可看大图
        string seperator = "\\";
: ^% k, o2 [$ l: A

* s6 f% N: k/ c% \3 X" e6 `                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
9 R1 v! U" g% q
6 ^7 w! L% n4 k, V
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
. k+ D/ R5 t- f9 g1 c% m2 b8 ~

' Y, d0 D2 H* Q9 y7 Z2 f# _                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());& X  _0 G+ P: ^9 O
& W- [) y! J, V0 k, q3 k0 V* f( j
                               
登录/注册后可看大图
        myDocument->LoadFile();
$ Z9 N  g4 F; x# I) `7 q  \/ F
" |! C, Z& T+ f' V, W% ^
                               
登录/注册后可看大图
        //获得根元素,即Persons。
4 |3 ~. J7 s; Q% D
0 s+ G# N2 Y! w, L. {/ g
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();/ ^/ v  s$ z1 p% \  x

8 e0 ~) h  Q% g$ \5 P                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
9 n& k6 m5 U! m3 Y5 B

3 C- Z0 ]3 A0 F                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;: O4 J1 g/ s. [- Y  F! L+ n

8 n/ y% _' X! u$ m                               
登录/注册后可看大图
        //获得第一个Person节点。" b% m- [' d& q9 i# u
, j# X  q9 `- u: h. r
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();8 V4 X  q, b: L" @# J: }

. G: F$ D- p7 B' L' J7 g( H5 S                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
5 L9 R. z/ _, P! Q( t5 S

+ X7 U, Q+ f3 @& K* O  G                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
6 O- N, G1 _/ y( ^" F1 P  W" m8 T& Y
" g$ h1 }3 ]& z3 y  R4 y' S
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
) D( r% J) c; k5 v1 H
/ H! e* e, x! V- z6 c
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
% z2 G6 ]9 @6 H- j

; P  {# i  g  z. |3 x                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
0 z6 O3 v4 h* z( D

" @: C! h7 `$ R0 v* J- {' r" |9 B                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
0 c) ?; c, ?1 o
+ J: g/ [) j& g) [; i& R# p1 T
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;: U& d8 x8 Q5 A, a# U  c

5 S# W+ V; J9 x" {' J$ }                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;" w+ W' A+ d7 D
1 y$ a2 g; x2 r: l" j; Y
                               
登录/注册后可看大图
    }7 L2 `+ S7 r0 z6 X% j: p

9 Q: v" A+ \0 R) [1 e# C; X. w                               
登录/注册后可看大图
    catch (string& e)) M, H# _# K2 a0 `- W2 H& F- n

0 Z' D# ?: }3 @4 o5 r& q                               
登录/注册后可看大图
    {4 F% [7 n/ e6 N6 q& H8 E$ N4 ^
( b& [: C. g1 j
                               
登录/注册后可看大图
        return false;6 p2 G- W0 O( G

( ~( f; ?9 i! o: A. t/ ]! u                               
登录/注册后可看大图
    }1 X) |8 i* d  [

- F6 q6 W5 }& @& n: g4 F+ d                               
登录/注册后可看大图
    return true;7 ?* u& p3 w  y+ ~
9 ]2 }, V! q) w- ?6 D0 b
                               
登录/注册后可看大图
}
5 V/ t" W$ H% C& R) [
* Z- O6 S3 \4 M
                               
登录/注册后可看大图
int main()- [$ W0 Z$ m! q8 ~! z5 S" i5 x

2 ~0 k) G6 k" s! z6 s8 K                               
登录/注册后可看大图
{
% o7 z8 A$ Y7 `3 j# @

' I, i4 v, r% q                               
登录/注册后可看大图
    string fileName = "info.xml";. _; G# z7 H8 \; d' j! s
* p5 }7 e' m. }
                               
登录/注册后可看大图
    CreateXmlFile(fileName);7 Y  {$ L, F; u

; j+ P  F5 X" a0 `7 `5 o" d                               
登录/注册后可看大图
    ReadXmlFile(fileName);
( d( |/ S+ j: U. _

2 @0 y! z% W5 e                               
登录/注册后可看大图
}0 h/ W- F6 u+ \4 b/ r2 x4 `8 M
; }/ v+ H6 f" N2 ]( ~( U
                               
登录/注册后可看大图

/ Y+ }& A4 j) U. i% g5 C4 c
7 p% `7 O  a4 w% b+ g4 i
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

0

主题

24

回帖

121

积分

注册会员

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

    我知道了