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

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

[复制链接]

2015-1-29 19:28:56 4627 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& ~6 u. c- T

( U1 [5 A" n- k& B                               
登录/注册后可看大图
   <Persons>8 B. `1 x6 S4 [- U& f
% P; T& ]/ \8 D8 j, g& o
                               
登录/注册后可看大图
        <Person ID="1">
5 E; U2 v- D5 n5 w2 E# Z7 ]8 W
7 @2 X% s/ G! l& x& J: @5 S- J
                               
登录/注册后可看大图
            <name>周星星</name>2 `+ o: M+ f$ e. \( i( T0 ?3 O

+ l8 s* t  L( q( W                               
登录/注册后可看大图
            <age>20</age>
: o9 x1 P6 v& S* J5 ]

# F. J* W* D6 {- a! c* k                               
登录/注册后可看大图
        </Person>
+ L" A! ~# n; ?* S

2 Y& e0 ]6 t0 z& O; J3 [                               
登录/注册后可看大图
        <Person ID="2">
  u% a  ?# y; E$ e
5 {& G0 C" e4 P
                               
登录/注册后可看大图
            <name>白晶晶</name>
3 ]5 {" c, c7 N' y
+ @5 R) o% [$ o, s
                               
登录/注册后可看大图
            <age>18</age>
. W0 H% R0 @. O- u7 O  F# v
1 O; C- E* x7 M3 X. w
                               
登录/注册后可看大图
        </Person>+ I: g% |: _. s* @. C1 Y' c
3 B# k6 X$ X) a# W/ \
                               
登录/注册后可看大图
    </Persons>
: P  a$ b8 ~; }! j6 s& R

0 o$ Y: ^2 L1 x8 N4 @" f                               
登录/注册后可看大图
% p* O7 L( Y) v1 y4 [
在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文件:
% l3 M4 ^. _+ I( d

1 B# a6 s4 `$ \$ `/ a                               
登录/注册后可看大图
<Persons>5 ^% ]8 ~$ Z1 g% w

2 E, ?& }7 `/ _$ W5 I                               
登录/注册后可看大图
    <Person ID="1">5 R/ k1 x. W! D, [: |
& D# B7 q6 U3 Q/ @7 h
                               
登录/注册后可看大图
        <name>phinecos</name>
7 H. |3 \/ p9 ]& g

9 [1 D# N+ ?: T9 M. \                               
登录/注册后可看大图
        <age>22</age>, {. h$ w1 t  {

8 f, O  X9 c& o7 d4 H- c- F                               
登录/注册后可看大图
    </Person>
. ], S+ B' t# S+ r$ J% b6 H
% z! Y5 n3 B" n; u7 b) z9 Z
                               
登录/注册后可看大图
</Persons>
! Q0 e# ]8 n# k
; ~! [6 X8 |* N# a
                               
登录/注册后可看大图

% i  S' J8 K, V) j) @7 ~7 n
读写XML文件的程序代码:- h, }: h' D+ a% V) X
+ R! D+ B8 ~/ _4 u% ~/ t: n
                               
登录/注册后可看大图
#include <iostream>
! R7 E- X4 w3 \

( \2 w4 p6 Z0 ~) g8 o1 T3 V% h                               
登录/注册后可看大图
#include "tinyxml.h"
9 c) t; |* \. D8 z

: m2 q. g! }# e( f. Z# Z                               
登录/注册后可看大图
#include "tinystr.h"8 ^6 ^1 B/ J7 G. p

! `# _+ H+ q, L: P                               
登录/注册后可看大图
#include <string>
  Q: q, V- Q& c$ F2 K9 A  z

$ ]0 U, T1 U9 R. ?' K7 A  Y1 E                               
登录/注册后可看大图
#include <windows.h>
3 M! n- U& n2 Y  l6 p
% ]  @. C8 _& W$ b4 g
                               
登录/注册后可看大图
#include <atlstr.h># s+ }# D' v# c% A% N% Z
' ~' Q+ ]% l& L4 W' v
                               
登录/注册后可看大图
using namespace std;
1 ?! C( Q# h* j. Q, u
/ y& X* ]2 a/ b2 @3 E6 f2 Q
                               
登录/注册后可看大图
4 V  f1 R' D6 E7 a# z0 \  Q

& J/ E6 }: c+ X1 @0 f/ P% ]) p                               
登录/注册后可看大图
CString GetAppPath()
0 m) p- P0 T" B: _" p  w" U

' L2 R+ \/ t9 u7 Y6 `                               
登录/注册后可看大图
{//获取应用程序根目录
2 p4 M( e; n( n8 r+ V2 w
2 G  J( h( k5 w# k+ ~
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
7 N+ {3 C* H$ S- i( d# C& Y

3 y$ }, R. ~* Q% {                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
) b4 ~' H! a5 a3 M: j# W9 L
  d- M) v& m& X+ F" l* S& I/ f
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
9 F: ~7 b5 b5 E6 j2 _/ U1 d

' j; ^! ^# D" x. A                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));4 E( G' ]1 T+ Y

* B& _6 A$ R; f                               
登录/注册后可看大图
    return strModulePath;& `; b3 ?' K( ^& v

3 T2 Q( F! C1 G+ O$ [6 K# X$ c, L3 s                               
登录/注册后可看大图
}3 @0 L* n3 {* D+ n/ H% K
6 ^* k+ P# O, W# i) B- P! A
                               
登录/注册后可看大图

& R0 q0 d: @' h

8 K  ~% K9 P' k  m1 i  u                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)( Y- A8 \* Q9 A# \/ t8 [

$ I# r( s2 E9 E' I                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
5 v5 }# ^  X1 ^1 H; F% V" D$ w
' w$ L4 x) D/ B+ `; o! C
                               
登录/注册后可看大图
    try3 s$ Y, r# z( r; b+ \# F& {3 n1 G% u

% o2 k; p9 ~% K1 t8 `  }                               
登录/注册后可看大图
    {+ R/ o* K5 l+ ]* M. [9 u
2 `1 f  M4 e/ c9 A" W
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
8 W7 S1 n5 M4 l$ i5 b/ Y, d

2 H! l$ s( U5 I2 ~5 f0 d                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
" [+ s4 Q& I4 i0 M

( c) \3 [6 }" L2 z                               
登录/注册后可看大图
        //创建一个根元素并连接。
' Q8 R# L0 ]0 s  I% ^
6 W7 f) N1 Y& Z- F
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
( J3 n) s7 `" ?) A, `9 ]& x

9 n% u8 k8 H4 E5 C                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);$ p1 w/ U0 K; t  _. x. ]
0 f& m+ y0 Z# X/ [" |  `, o
                               
登录/注册后可看大图
        //创建一个Person元素并连接。7 d2 Y9 l, ?7 D7 M7 G# [7 e

8 x, {) _5 `0 R                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");! `' |9 m4 _' w" Y% w

; J4 n+ f2 b7 d8 H; M7 t0 k* z                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);$ }1 y, p) @; v  E2 c# m
, m/ p. Z4 ]5 S( e9 `+ L( R, }) ?1 ]/ X
                               
登录/注册后可看大图
        //设置Person元素的属性。$ K- t, i) V1 |$ i+ I

  J6 r% v2 {6 g1 e) r; F                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");# `' \- P9 U( p4 P9 B$ \2 i
/ ]3 h' q' G8 I, N1 r! ^4 E, m5 ^
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。1 D9 W/ @+ F( r( z! C7 |) b+ a) F

; y% S3 K( N9 t. r                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");& r0 n; T( y3 [, ~; H4 f5 b

' ^: I' I; |  E9 a) n8 J+ j2 U/ S- ?7 w                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");# w0 Y; X2 }2 Y1 Z# Q8 j

1 i# U, I6 Y4 ~8 t# d$ W                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);/ \% e% K) ]$ _4 }/ i; _1 H

! I$ e) J! _! z+ O3 l9 e                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
- ^7 k+ U4 `6 Q/ G

0 X6 `0 [7 m+ V                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。( y/ W4 v9 f1 |/ f

/ d8 r3 [2 }' K& H! ~6 |0 d                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
- a8 j# M! g2 f* ~8 ^# A3 P

  E; [0 i9 V& {) B                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
/ F6 l7 c( I  E. q0 q5 ]

8 Z  g. ?2 H; |1 L* K) o( M& t+ q% q                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);7 ^# ~2 N% m3 V6 |+ N- K  A1 X

: G# {" ~+ g  P8 p# ]& ?! x                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);# L% j3 {* Q, P

  B) P- B7 X) Z# ?/ D                               
登录/注册后可看大图
        CString appPath = GetAppPath();
: ^0 F2 g% Z7 f/ ^! g
1 N7 U+ N+ |/ w" w0 C
                               
登录/注册后可看大图
        string seperator = "\\";
9 z0 t$ n& q4 h9 S$ ^4 x! y

/ A$ c' N5 `4 P. k- ~; @                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
  z+ m$ o2 s0 @
2 y* V0 \' D* j& p
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件* ~( F5 \5 T4 b6 Y2 m

& x. |/ x7 D/ H8 E: q                               
登录/注册后可看大图
    }9 f2 y, J. m6 |
; }2 ?4 J! U0 O7 s: S$ M: p0 h
                               
登录/注册后可看大图
    catch (string& e)
4 b4 z: t% ]( Y
, F4 |3 z- x8 I% Y5 |. m; u
                               
登录/注册后可看大图
    {
+ a8 o9 E# v: |# @' I7 ~
8 P" I0 e2 @: S4 V6 ]0 B
                               
登录/注册后可看大图
        return false;
; ?8 P. k, v, Q6 Z

4 b/ ]; [, f8 h( m5 \                               
登录/注册后可看大图
    }; j( `$ b% J0 i/ @6 X2 R: F
# r  L" i% X* \$ B& j) ]
                               
登录/注册后可看大图
    return true;2 Z: S  \+ J  _: F
( h1 k. s4 A& j. O  R) O
                               
登录/注册后可看大图
}
5 H3 h& r( h" o+ R0 B

( F- [7 H; J: w+ o                               
登录/注册后可看大图
5 i; b2 u1 Y3 r% i6 E/ E
- Z1 o1 }; w+ U2 n4 H
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName); Z  k. V, S& H

0 k" P% O  u% I/ d# W7 X1 B                               
登录/注册后可看大图
{//读取Xml文件,并遍历) s! S+ ?. x- |+ ]- k6 U3 s

/ m: ~. n. {- v% x1 O                               
登录/注册后可看大图
    try. s, B. V) {' T4 b

7 ~7 D3 v1 W  B* P' D# M                               
登录/注册后可看大图
    {4 t! g' x* E" R

) W. U8 C+ h0 j                               
登录/注册后可看大图
        CString appPath = GetAppPath();2 G6 u( I1 y4 E# \7 j& j+ g) F
- ~# |/ M$ m* L$ w1 A1 _0 D4 A
                               
登录/注册后可看大图
        string seperator = "\\";7 Y! z" i( q- I; _6 s

' x4 p" e7 G; b* a6 |                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;' {" J" o) |% w/ i  \! {

) m& \; x9 I) o9 z/ g# E                               
登录/注册后可看大图
        //创建一个XML的文档对象。$ I; E- P. z3 P. I+ {

+ n: O& b' Q6 f# C! r                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
* _6 Y0 j  j$ E2 Q2 i; _( ~  n

; M: x" |. W' \8 q* s! K) J                               
登录/注册后可看大图
        myDocument->LoadFile();7 \9 o* ~" q. U. x4 R3 W
7 }5 L, u% g5 `$ I
                               
登录/注册后可看大图
        //获得根元素,即Persons。; E% R4 l: c4 B6 F
. c; r! G9 |4 P
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
: l/ O8 H1 H8 r% ]4 {& }

2 {6 [9 C7 P9 S) z! B                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
" @& [/ W3 s8 V: v

' n  j0 g; h9 b, A& v                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;; E+ w6 U, J& M. x

! f$ q. q/ ^4 T2 F                               
登录/注册后可看大图
        //获得第一个Person节点。  E" N6 E3 K3 x- ]6 {

4 K, ^) @0 o. K: _& R+ T                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();9 ]( c: q  p* T6 R
$ i" ^& c+ {7 g" k, o4 S3 h) \/ E
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
! t* I  V. b" u" O
* F( ]. v+ a% C( E' l2 o: p+ _0 G% d
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();/ y/ \' C# o5 X" w

/ q1 y6 _: M" F                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();7 D2 y2 D) h  |

! f' ~) b% f# G8 U* Z. J                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();* G4 a1 y  W9 ^0 p2 J5 [
" j  M) }, `0 p' {3 I
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。; s% z% O3 [* s

" a+ P' K1 W# q9 B" c5 _                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
2 ~* Q: f: K) F6 D- [5 i
( y$ J9 i5 [- r- I- d: c* t
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;- s6 U* t0 s. j/ U' j
% m" K& N3 f5 U1 A
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
! c) r3 ~, ?& }! P  l/ c
  H* i# K# M# F( f: j& z
                               
登录/注册后可看大图
    }8 u- o/ n, l4 B; j8 A9 B8 Q

7 |# ]* ^* W; I1 ?% Z8 X3 x! Q* u                               
登录/注册后可看大图
    catch (string& e)
" `4 m( M1 a. ?1 ]; |$ {
; ~; P, V, g/ x) a4 w
                               
登录/注册后可看大图
    {
9 E6 M4 f4 Y7 P% }6 }* _8 o- {

7 h( P# H+ ^8 j3 X                               
登录/注册后可看大图
        return false;
( h& k) \7 m' H6 D  ?

1 ~: C3 j* h) m                               
登录/注册后可看大图
    }5 {2 P+ U! G& ]4 P# p

9 {' Q0 e& k! m) O; \* z                               
登录/注册后可看大图
    return true;
7 E' U/ w3 A# Y- ]+ H% _

4 [$ g) B/ t1 M' Q+ ~  O+ p                               
登录/注册后可看大图
}
& e0 ^, a  Z" _( U9 |

3 Q, B0 f* d% O' X" Q9 z                               
登录/注册后可看大图
int main()( y- _: J; }# f% P: y

3 {9 @0 `3 W9 R" c) L! v                               
登录/注册后可看大图
{2 S/ `0 S( A) v" I
* F/ \# }7 W- f: |& z% z; N
                               
登录/注册后可看大图
    string fileName = "info.xml";2 O( u! s9 D0 Q0 W1 i3 z! o
/ E, L2 L3 k+ n+ m' }  X7 |
                               
登录/注册后可看大图
    CreateXmlFile(fileName);( i, R7 o# A5 q* z$ P9 L5 @

0 d6 Q1 d; b2 X9 Q+ u! [                               
登录/注册后可看大图
    ReadXmlFile(fileName);
& c! b- K/ b- j$ R

1 O/ D$ d4 [" N, d$ a: S# ~                               
登录/注册后可看大图
}
. G& F+ x, j' C! a( D4 E# ~

/ ]: t' o1 |/ {0 U                               
登录/注册后可看大图
3 B: q6 G/ @4 D8 B/ m/ u

5 G% b! T) n( ]. C0 E- \  Q% Y
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

0

主题

24

回帖

121

积分

注册会员

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

    我知道了