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

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

[复制链接]

2015-1-29 19:28:56 4551 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片段:; }" v7 |' h, f! \
$ _  y! R+ o6 n
                               
登录/注册后可看大图
   <Persons>9 b' J, M  m2 k  J5 \
2 m- e6 {) i5 y6 K5 b0 O
                               
登录/注册后可看大图
        <Person ID="1">
! c9 h6 u4 E) V: T" T- o3 Q9 @
4 `& [$ |+ K. D( M* C! z8 k
                               
登录/注册后可看大图
            <name>周星星</name>* S( d% J/ s- t! g

4 Z0 a# ~# {8 d) n: r                               
登录/注册后可看大图
            <age>20</age>7 e- k# ^4 P8 \# d, e- v  l2 v

6 B% w& [* g0 F% e4 H9 o9 Q                               
登录/注册后可看大图
        </Person>
8 i( j; R" k+ p  v- P2 t( I+ t
( V# N1 j% h% |3 D+ h
                               
登录/注册后可看大图
        <Person ID="2">$ x% n1 ]8 o6 g& a2 m
+ M2 ]) J+ h& r( \) x$ N, Q
                               
登录/注册后可看大图
            <name>白晶晶</name>
. W4 w/ [; x7 b

6 ]4 a# L$ m' o6 h                               
登录/注册后可看大图
            <age>18</age>. Z4 w; P9 w) C3 Z9 u

3 y! [  R# F" }2 c4 q% A7 n                               
登录/注册后可看大图
        </Person>) H7 ?8 |# H5 B% C7 ~4 `2 X

; E! i. X. F- o7 h3 W, B                               
登录/注册后可看大图
    </Persons>
9 }, R0 h/ X) S8 X# S" D4 d
3 t8 i5 y# x, c8 s4 h2 n. }* p3 \
                               
登录/注册后可看大图
* V% q# u1 e' _3 j+ d. e- k! u# L
在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文件:+ W8 a. e; S( z% I' F: N

! W: b8 W& W, n1 V+ t) r                               
登录/注册后可看大图
<Persons>
# N* f; W  V% \* T  b% n

1 D) I, \8 m& {# a, T6 B3 j                               
登录/注册后可看大图
    <Person ID="1">
7 m4 P4 q/ G3 a; a5 Q* ^7 @$ X5 c7 t
% F1 e5 e5 L$ q1 e4 V
                               
登录/注册后可看大图
        <name>phinecos</name>
! {5 m& r$ R9 M4 y; K7 K
7 }; I5 K- b8 s6 E. y$ ]2 h) t! e
                               
登录/注册后可看大图
        <age>22</age>( _  w5 H$ b. D8 ?

8 D# v" d1 I/ ?, W9 a                               
登录/注册后可看大图
    </Person>
) u8 O) ]& b. M" O( X
% h1 n4 F; _  D6 X$ X& a9 m: C, g
                               
登录/注册后可看大图
</Persons>" s$ k5 P2 ?& w! z- r4 f0 G( I( t
, O0 l! q5 z7 j$ p' A* \. c: a
                               
登录/注册后可看大图

7 h/ b8 `& _1 m. S
读写XML文件的程序代码:
# i5 H/ N, \' i' b' v
, ^' \% ~# A0 @, z; Q
                               
登录/注册后可看大图
#include <iostream>
1 I' g% `- b* U

/ a0 S' H4 e/ u0 u% W  v                               
登录/注册后可看大图
#include "tinyxml.h"* e! H9 j" |7 I5 A$ z, |; m9 @

; N9 ^% g# Y% k2 T  j  b3 z5 A                               
登录/注册后可看大图
#include "tinystr.h"
: `  r2 a  x' g# }7 k7 T

9 u! l% C. y5 j# i                               
登录/注册后可看大图
#include <string>% H/ t9 I2 F  R; a& D
2 r; H; b; K8 W7 T
                               
登录/注册后可看大图
#include <windows.h>
% z, _; u8 x  v
2 E# m- v. C1 h. {8 ?3 e$ Q
                               
登录/注册后可看大图
#include <atlstr.h>$ z" Q  L2 v$ w' V+ u. u) H& o

2 ]6 A6 B0 \4 W) y* |! Y8 Q( Z0 A' H# y                               
登录/注册后可看大图
using namespace std;
. g/ [/ K' N* r* t3 }- W- X' b' ?% m

, T& |4 p2 X6 [7 v                               
登录/注册后可看大图

4 m: S( t$ T8 H9 Y) E

8 W! H2 V0 z' m5 P2 Q9 J+ O                               
登录/注册后可看大图
CString GetAppPath()
( K3 j. t( R9 c1 I# E
8 a" B7 P$ o, B
                               
登录/注册后可看大图
{//获取应用程序根目录
. Z/ J2 K( @! m+ t
6 h- W% L( V, b3 M
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
! j3 u3 j+ d$ }% x
4 M  ~: M9 r8 C1 ?5 ]# y: R
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
. R5 [/ V! O3 |3 b( b$ @! ]
+ C, G- _2 l1 G
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
4 {: ?( Y9 r' }5 y0 Z

( F) L- ~2 n6 J- Z1 ^                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));% F1 x% N! h( p) o8 x' m

9 }9 w. ~3 i- ]& u/ N5 ?                               
登录/注册后可看大图
    return strModulePath;0 m5 U1 n: E* l3 t* u/ j
; J9 e' e- q. A7 ?& F" W: n# Z
                               
登录/注册后可看大图
}- M, B8 ]  E$ _0 q. a& p

- H7 E' {$ q3 [+ m. ]                               
登录/注册后可看大图
. l1 Y. n% A4 ^$ D9 l3 i2 P4 I& Y

( H8 a  ?2 ?; W# F* Y, Z/ }- v+ h$ {9 p                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
$ R4 p" s% o7 ~- h9 _% G

/ j& k, E: o" a; q$ G, ?                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
8 v9 {; F5 M+ n; k4 P+ o, }

: F! Z. B8 ^/ _0 n% {                               
登录/注册后可看大图
    try4 ~2 _$ o: A( T% J2 I. U  P$ g; s: }

) Y; @3 u6 _/ y- j* r                               
登录/注册后可看大图
    {3 K. t7 t% G& J+ Y$ z4 h; R0 ^
$ x: w5 O/ l$ d4 }0 i% P% m. t4 H
                               
登录/注册后可看大图
        //创建一个XML的文档对象。4 ]. Y3 _& T1 Z8 i& ~2 i2 T6 U

( A; i' w  q# ?2 u) I. `5 Q                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
: K$ J' ?. I# I% x& r5 [

3 i( u* i* X3 i                               
登录/注册后可看大图
        //创建一个根元素并连接。
5 V  @3 ?/ D* c& g( Y4 w
2 B9 Y+ o8 H1 }2 R* R6 S/ e7 a
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");) f4 Z) o2 H' ?

9 u3 a1 B$ }/ I# E) R+ L8 }                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);1 r$ k3 a4 g5 K' W: K

9 ]; a# r- N1 W! }  E8 E& ]                               
登录/注册后可看大图
        //创建一个Person元素并连接。$ F  e6 ?4 L0 R# z  E, V

2 g; E1 Q/ ^6 k" u9 I0 Z) w" e1 K4 D. D4 g                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
: @4 F/ b0 w, |* K( b3 G7 l
, g2 v& f; S' h
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);: w3 q& i2 r* N, w
7 a1 T, y' [7 J2 x9 Q* |; e  z4 ~
                               
登录/注册后可看大图
        //设置Person元素的属性。. f( \! f$ U) K5 T
( x7 z. J: o7 O' O+ c
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");2 c* _% f8 C  d7 h

' h( _( Y6 _, R) R; b% r7 R' E                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
: [( \9 A; w1 `( W) o4 Q9 W1 t
/ |6 K/ X4 Q  O# Q; T, K
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
- d/ v! H# Y+ Q/ a) ]( S% n; P

; G4 n7 r) q7 ^4 ~                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
! a+ S, M- K5 K5 \, [8 q0 m

% m# t/ x9 N7 M! v                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);' w& t% W4 g( Z+ \
8 E; h+ B! m+ S& D) R  v
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);- {4 C& A# j0 c3 N/ }2 e& Z& A! L2 m

  V/ u' v% g3 e2 @- s( A9 ~! e$ M                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。. J: X$ v* o0 V) G. \% n8 K

" D3 ^+ o: R" Y1 B                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");$ i# D9 j1 |5 K
% K9 j9 {2 W' M5 H6 M3 x2 W4 E
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
5 @% q: w( t- ]! @  [$ e" B8 b1 r
$ [/ s, |8 s7 v; z# b* K
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);6 Q* P# u0 g$ t. ?* K
3 J( ?' g; Q% R, s' b& a- R/ A- S
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
7 F: W, b; i6 {. F
1 K# a0 c, y& Z, S
                               
登录/注册后可看大图
        CString appPath = GetAppPath();, D/ H3 [+ g8 \/ _. B. V- U
$ W4 V8 a7 _% ?: r
                               
登录/注册后可看大图
        string seperator = "\\";
: C4 K3 z- W$ R" K" A

, C/ E- k3 q7 B7 h                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
3 n+ l5 L" e: d1 w! G+ U

, m* r; T: |; N- S; c                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件" @( E4 `4 d% t9 P: D: R
9 {9 Z: c3 n6 o' P0 _2 P
                               
登录/注册后可看大图
    }& H& k( `0 A7 A5 i) X' O# u
( r( s5 r$ o2 y8 ^0 P
                               
登录/注册后可看大图
    catch (string& e)8 b9 f; k2 S: W- Q' J

8 p% \- N# F7 D+ ?                               
登录/注册后可看大图
    {
- H' b$ l, W6 c7 _
, y) o3 r) F! s, X
                               
登录/注册后可看大图
        return false;
- t4 n" b  Z4 f; v& M& r

6 z; N" O3 [- p+ D1 f                               
登录/注册后可看大图
    }
- y/ c% g3 p" q+ u% x* `* z2 H2 _
- o' x0 @8 U- N
                               
登录/注册后可看大图
    return true;2 }3 v! D8 @& ~" t
8 A. l$ s2 \" M) y
                               
登录/注册后可看大图
}
: p. N1 Y$ c; r8 ^. w

$ g# \9 K# Y- i                               
登录/注册后可看大图

; y# I( T% U* {" k0 X. `

+ o0 O+ V) u, a1 Y3 d                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)8 ^8 j4 T3 S% b6 v! f6 R
9 J& Z& B$ W9 `. u  S
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
7 A+ t" v. U4 D* Y6 J/ C
( u4 S5 K1 }; j# L7 d
                               
登录/注册后可看大图
    try
8 q4 o) [5 j# C( }# i6 x
  {3 U9 ?1 Z, i7 ~* |! c& O
                               
登录/注册后可看大图
    {
+ e5 T) M+ \5 J* }0 K
' h: f! b# u! M7 T% E* f; l/ y
                               
登录/注册后可看大图
        CString appPath = GetAppPath();. c4 `$ A; K, M
8 k# ~+ ?  {8 |& p; f" O
                               
登录/注册后可看大图
        string seperator = "\\";* k$ x! I$ w! R

! i! y8 g& P! ?. T/ Q) C" F& ?                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
- N/ m8 |2 b6 e; w3 `5 t( {4 L3 c) u

* i% k/ O" L) T, T1 h1 v                               
登录/注册后可看大图
        //创建一个XML的文档对象。/ f8 K: D8 {! `1 h

* M. ~9 t3 o! y" c1 H3 q                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
% F0 }0 ]+ Y! F8 Z0 i4 r/ t. Z

# h7 j6 r, v$ K0 x9 c7 [- W4 q4 X. B                               
登录/注册后可看大图
        myDocument->LoadFile();. i% p5 }, |" O$ ^5 h! u

8 ~; Z" _, O+ B! z# J% C" |                               
登录/注册后可看大图
        //获得根元素,即Persons。
% M" C: R3 N9 e
4 a- o2 {: `$ k3 f3 t
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
+ U6 |9 x9 @* O6 F
: ^, r& o: `( L! t$ {
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。) x% m; W' x# A. W4 C" r

/ \& a% O( B) y- g0 R7 O8 z, Y                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
9 s; D" r6 H8 t2 j
& H4 A0 Z1 A0 |$ m5 f
                               
登录/注册后可看大图
        //获得第一个Person节点。. ?* [, |+ o: Z+ t
5 m: I9 l- A6 W1 I/ \3 k
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
; u- `( C# C1 z' l. b! z' F9 D

& B) r6 R( Z0 f' _3 X, H+ s                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。; H; D8 Z( d9 D. c) [% ]# C

: P- Z3 s& Y, o4 b                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
1 H+ F# L$ M% b1 ]. R

4 @1 v/ K' p2 y; f                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
5 y8 Y' l( I) z4 U; e& u# Q
- F+ S2 p* Z( b7 C- S
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();% N+ V: q' X( g8 R! L9 b

3 y, Q/ E  s. q6 j% }                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
1 K- s( f! |1 ?/ T8 I
3 c- r0 N6 p8 U) A# h
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;  r2 [. z3 l5 ~' `* B

; N* _: E! P0 _% e  R                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
% q/ o# _+ m- a
" t" d! s0 g* k" u$ ]. l0 h" T
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;# T0 n6 F: |9 j- l( [4 b, A# ~2 f

, m3 {& ~: U7 m5 A  O) n- Z                               
登录/注册后可看大图
    }
5 G- X6 P& c5 K/ `( \; Z
' a% S  S2 E+ p
                               
登录/注册后可看大图
    catch (string& e)- U# R3 i, D. T0 w0 F, n
0 @: ?: }  r: b8 P4 Z; M& t
                               
登录/注册后可看大图
    {8 n1 ]1 f- O7 A$ k. S* g

/ Y# t5 ^4 E$ X1 s9 K                               
登录/注册后可看大图
        return false;
" ^( L8 r( W! ^& R

6 `% E1 A# L4 m7 ~4 m                               
登录/注册后可看大图
    }* ]: [- S2 O, O9 P

( a% F& q6 y7 ]3 e                               
登录/注册后可看大图
    return true;
. c# a9 o; Q/ ^# g  v

* D! a' I* p# a& E1 ~1 c                               
登录/注册后可看大图
}
1 y: A' d1 f7 ~
' u1 \& `4 M0 a' r
                               
登录/注册后可看大图
int main()
. S+ E( d( r7 u) E. |  C
- u2 x0 j# |* N; q5 Z
                               
登录/注册后可看大图
{
8 p4 L7 y' C! H8 d

6 B% t$ w& L) a( C5 S4 g- h                               
登录/注册后可看大图
    string fileName = "info.xml";
* c* P! J6 |  R6 Y8 [

; P0 ?, q% w$ \  ]4 l                               
登录/注册后可看大图
    CreateXmlFile(fileName);- ?! j, }$ {. s- E" U4 t) J

: R6 T/ [* T3 i4 [3 u, [                               
登录/注册后可看大图
    ReadXmlFile(fileName);
5 u0 `0 [& g9 _

# y. W2 @" ^7 L7 {9 H8 ^                               
登录/注册后可看大图
}8 Q& ]: Y& F- s* ^: C. N
. P0 I! n* D5 g9 U- s: n# ~
                               
登录/注册后可看大图
% @7 x8 l/ K% G: b, p

0 K, ~- ^; Z% n5 }! g1 \( ]& ~
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  ' O3 ~3 f9 N8 O; @
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了