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

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

[复制链接]

2015-1-29 19:28:56 4376 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片段:, W) h. |/ x: g2 r

% d. O* {4 B9 S& D1 r                               
登录/注册后可看大图
   <Persons>' }; @' X0 s( {7 r

' b, U! s' G) h7 b7 e                               
登录/注册后可看大图
        <Person ID="1">
) v1 m- E2 P2 l4 s

+ {/ x- u" V) {; l3 h) w/ `8 M                               
登录/注册后可看大图
            <name>周星星</name>: ]3 u9 t4 z" p( X7 j
, P7 m7 t% y, |% Q1 h0 k
                               
登录/注册后可看大图
            <age>20</age>/ V+ L: h/ F/ |
% J# p, f' V+ l$ g: K) ~# z0 b
                               
登录/注册后可看大图
        </Person>! e0 s  c! j8 _5 {9 F

5 @7 \3 s) E& L2 V, Y8 C: p                               
登录/注册后可看大图
        <Person ID="2">% r5 t& l- ]) K  _0 k, t! j0 Z
! `5 E5 d; E8 ]8 v
                               
登录/注册后可看大图
            <name>白晶晶</name>
9 }1 j" W5 I1 \1 N

) L& d5 ?" j' ^: @. l' k                               
登录/注册后可看大图
            <age>18</age>0 c) I! g+ ?  m
5 ?) w# H6 u8 Y
                               
登录/注册后可看大图
        </Person>
0 u0 p) t) ?6 o0 Q' t1 d6 y

* Y& b% @3 ]! D5 j: ~6 C" [1 O                               
登录/注册后可看大图
    </Persons>+ G& n2 r1 o4 |7 k- T( G. J
! [  J8 D( e9 a' f9 u
                               
登录/注册后可看大图

. |! l% C, ~- p, P
在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文件:
. g* E; C/ b. L0 j3 B( P# w- f
8 y  e8 m% ]' N1 b2 ~( t! U5 Q
                               
登录/注册后可看大图
<Persons>
2 q- y8 n9 ~) Z+ \6 I! `: ^
$ R. m; J6 A6 w2 p' ?* r, g
                               
登录/注册后可看大图
    <Person ID="1">
$ a3 [" ]" W5 y# Y7 X6 `9 g3 k
1 J% p2 j* @9 e' X! d
                               
登录/注册后可看大图
        <name>phinecos</name>5 g- Y) O' f/ G# J7 L! F
- E+ [/ s5 H( b) U5 }$ j8 ~
                               
登录/注册后可看大图
        <age>22</age>
& \6 S- i) ?% I

( t7 E6 Q1 m, J                               
登录/注册后可看大图
    </Person>8 l2 ?) i5 |- W
3 r6 f6 m! A2 x1 C+ L7 j
                               
登录/注册后可看大图
</Persons>
8 o, I6 i9 X2 P" f7 A, M6 [9 t* O
& r; b6 p3 s, @
                               
登录/注册后可看大图
2 S8 m, ^. E0 N8 j9 K& s
读写XML文件的程序代码:3 U# ]$ e( x: a' `4 v4 N
3 n  ^$ c5 {. h
                               
登录/注册后可看大图
#include <iostream>+ Q7 ?: p$ G3 [9 v! N+ i3 C2 f) q

+ g- q' O( v7 c( i                               
登录/注册后可看大图
#include "tinyxml.h"1 A6 X3 o$ \' Z  X8 \

" O& o5 Q; W1 @6 d# d                               
登录/注册后可看大图
#include "tinystr.h"
2 i7 S$ z) \5 t: a, ?: ~8 G

. z, n- b; h& G5 I4 ]8 ^" p; `; [                               
登录/注册后可看大图
#include <string>
' U% a% Z" F6 N% `
3 r0 Z3 Q7 E6 i- J6 R
                               
登录/注册后可看大图
#include <windows.h>
' n3 N9 C- a1 n1 j6 R9 N& r! R

" u- c( q7 g6 P: X8 c                               
登录/注册后可看大图
#include <atlstr.h>: \% o( s  G( |" f0 h
5 f1 v+ j1 n4 C+ A$ Z/ o  k2 F1 k4 W* t
                               
登录/注册后可看大图
using namespace std;
0 w2 l; ~& C( _" z6 S9 R/ `

8 _' s* G' N5 T$ n                               
登录/注册后可看大图

# B/ `& l/ a# C0 ^7 D% M/ H7 d
: e$ j: V2 i* x, [
                               
登录/注册后可看大图
CString GetAppPath()
' E3 g! `  d! ^1 y
# ^0 J; M2 @& }0 b
                               
登录/注册后可看大图
{//获取应用程序根目录
9 T5 y; c4 w& F" s7 l( O
9 G$ t. U+ M3 h  e0 A- M
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
9 S' i( A0 a; y! l5 u1 u
$ S% @- ~1 N; E8 r- T
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);) k& x6 i0 N1 n" g+ \7 }% j* j& O
& i$ a  }( Z: c2 l! k: o. {& F+ J
                               
登录/注册后可看大图
    CString strModulePath(modulePath);( Q, d- s. D- q

* h* E0 b* L6 b+ L                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
7 Y2 b  h" i& i4 }0 ?* x: X

4 `; ?; t) B( t# ~7 f* ^                               
登录/注册后可看大图
    return strModulePath;$ w7 {- I9 g& m/ o2 r7 _( Z7 B
; Q) o& u" C' c4 M8 c; P
                               
登录/注册后可看大图
}
$ H* C" a4 L- Y; U/ x( W

5 _" j, o  d! U5 l" A8 q                               
登录/注册后可看大图
2 M' T1 r" O! z  c
4 Z1 S- D; h3 i+ ?) A
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
: o( ?9 j% N  q* \; V# p# _

! `& L9 U$ _3 e0 K" X                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false, u( d( a- x/ a7 ~+ u  n. k

% W1 M* J: j! B1 n                               
登录/注册后可看大图
    try
7 V- ?% {# D& L$ I

3 k& d- j& E+ {. f& ^. I& y                               
登录/注册后可看大图
    {* v; {; Q: D7 {+ z

1 g$ y4 t- m( E6 O. W9 s, H                               
登录/注册后可看大图
        //创建一个XML的文档对象。
: _, w7 f' B" Z. x
! b# ]0 x! J3 d% j' Y) D
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();! J( b7 u/ L' Z- c. O1 X
1 r& n3 h& h7 D& M2 z$ N- C
                               
登录/注册后可看大图
        //创建一个根元素并连接。. d  I7 x( `- N! x3 {* Q/ C
! U4 D: }' a/ F
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
6 o8 k2 q0 L$ N  o

6 N$ G6 O/ ~/ Q+ \' d                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
4 q6 C+ m) g7 h8 p* G7 K! T$ Q2 B

7 K( }; |( `: w, v, w                               
登录/注册后可看大图
        //创建一个Person元素并连接。
8 C6 b# H" X; b* n

' m6 E" M4 z4 i                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
' `8 B8 T* F2 p- q, ~6 Y  R! J

$ d, H* X, a* H9 b                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);" T2 |, V) U" g1 s$ X2 [

9 Z2 R6 z+ L+ e1 i9 y8 K& D                               
登录/注册后可看大图
        //设置Person元素的属性。! v  X# J  h, U' M+ c: T0 v

8 B- S0 \6 E+ ^                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");9 H' {& G3 {( k4 K1 C- f! I. @7 D
* S7 z' T! ~8 `1 v3 m- u+ l
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
. G7 n% }& [. Z3 S$ Q# `
- D0 k/ f) z' z! J
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");5 u' s. x% u; F$ [, ]) Q! l

& Y: x. r* C! T4 \6 p7 _                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");2 U$ G6 v/ M& `5 u

% p5 ^& Q" B; S                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);9 b: w3 E2 v8 f# s5 p
0 @' k5 T, z; u3 E1 L
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
' c+ }  l& u/ q! u' l8 s. v, G
/ Y& n  t, w7 A5 }
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。$ @0 J/ x# D  O, ~( F0 M; u5 X
8 z& E4 ~2 D, {- R# y$ t) h" |
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
& K* A6 h" x+ I: H3 j
1 I3 L" L5 y' p% s! v- U+ U  k
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
1 ?/ o5 [+ N" W# i, s" |

( Z, N: n3 k  h8 _; Q: e- v% Q                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);7 u$ s( `6 J# Q, \" L8 B
7 f  N) f5 X0 u- B
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
/ X8 v% N* M# u
2 g. e+ O4 c9 [8 [' X0 ]7 V
                               
登录/注册后可看大图
        CString appPath = GetAppPath();8 E5 a( ]" P; G8 u- w: I7 O
1 j3 k4 w) L* Z  e! Y
                               
登录/注册后可看大图
        string seperator = "\\";: U  p0 q$ b2 I* Q' r4 C+ `

- A# x) u4 a" a2 s# H: d                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;$ L2 W2 W$ R: {1 q, S

& f, _2 D" T3 o. W: s/ g                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件2 @* \( b' z9 ?4 f
0 O/ }2 {9 D9 A& _
                               
登录/注册后可看大图
    }
+ e, c1 _/ E/ ]1 W- r

) y/ Q* n$ R! }# k                               
登录/注册后可看大图
    catch (string& e)3 A+ ^8 F0 M8 Y  d" X) ~- e4 i

" f: P( ?$ P+ E" x+ r$ n                               
登录/注册后可看大图
    {
' s7 s- {5 J2 }5 v/ _) k4 B- t, o
5 l9 p+ ]; e* c3 V: b; {
                               
登录/注册后可看大图
        return false;" a2 r6 B5 W# p8 ]" M: L
7 O9 H9 ?( Y& o  X) h
                               
登录/注册后可看大图
    }
1 ?8 [! w- E; \
$ f, x; z' r+ s2 x2 y) l
                               
登录/注册后可看大图
    return true;
$ L$ b! s8 s" S! d

1 y7 n! R* |, Q1 r                               
登录/注册后可看大图
}2 |6 U0 z9 c& \) C6 R- K+ s+ i
* t& d- T  [) I2 o, Z) v  ?
                               
登录/注册后可看大图

4 o+ O3 Y1 s4 n. d
/ w7 H7 b0 }! ]3 ~7 g/ H7 g9 L
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName); m) }( ]  s& I6 |8 M7 n

. \4 Q- t! N- g. V! }* v                               
登录/注册后可看大图
{//读取Xml文件,并遍历
6 F2 n: u1 k8 Q( D

4 b" i. ?6 n: M$ t& E$ H                               
登录/注册后可看大图
    try: w7 S1 Q' B- y( L, y9 P# ^& E
7 |! |: }8 ^/ k, Q
                               
登录/注册后可看大图
    {: x4 h. E  R6 [" h) T/ e

2 a% ~. P/ T1 Y8 X6 j* q8 ?6 {5 F                               
登录/注册后可看大图
        CString appPath = GetAppPath();. V4 f, X! s$ D) O6 N" t

- e; R! s0 n5 d$ k                               
登录/注册后可看大图
        string seperator = "\\";
5 e2 k; @1 p4 R: R- K* y
- X( H7 n0 |" |# `7 z; [6 [4 V
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
) z8 R5 ]9 h& _: u( e
. y4 X! t9 `+ s" E6 U2 C3 o5 x- G$ N
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
6 l  m9 K; M4 m
, |9 w' l6 L' ?+ Y: O6 Y
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());& r- d; t) r. m3 c
% }4 M) P: R4 a; B% h
                               
登录/注册后可看大图
        myDocument->LoadFile();8 d5 P* e( q7 j7 Y! U. V

1 j) w4 g! L6 f9 g                               
登录/注册后可看大图
        //获得根元素,即Persons。% T4 c) a! \! Q% }

7 d, b6 }. o; H  F- r- Q                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();* |, s5 H. h" ]. g4 M6 ]
9 h, I& A, W. p% [- ?% X) A+ Y
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
: |4 t1 H% _1 H  d6 @
1 J+ D$ j( V: d- O
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
* _6 Z0 K6 X) k2 l
% ]- K! e# G5 d
                               
登录/注册后可看大图
        //获得第一个Person节点。% B7 v$ \- j7 ]3 H5 Y

5 v2 s( j* P8 F* }, V+ {$ W                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();$ }/ |- q* A# p' ?7 u' S; Y

8 _6 ]+ v. T4 M3 e                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
* }* @5 z" x( F9 F( i. N

, k2 d6 C- }/ X6 I                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
; Q. N5 S7 i; D: d

$ ~6 u* R7 {% r                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
& P7 A2 F. f' B
* L, @3 |5 O  p9 L
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
6 n2 x5 P4 ^! D0 Y) `( n$ @& `
3 s( Y. }) X7 R7 C
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。, s2 [+ r2 I8 J2 h" v) m( B& a( {
. ]. j+ h7 `; e( U* ~! O
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;$ o3 T) S/ i  E% _! k+ g
% j! |, I8 m# W: Z% I$ v- q
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;  S9 K2 _: y8 z
  n; L1 i+ ]5 Y8 a1 d
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;1 q/ I3 l. M4 B) [3 c  L. }
; x% M4 d8 q; T0 E8 g4 j$ _
                               
登录/注册后可看大图
    }
: L. k) I" Z  R( D
' ?1 g9 p% p0 L. i) a; q
                               
登录/注册后可看大图
    catch (string& e). O+ F0 I5 |. p! o8 n$ C; |

: C. Y: B& D* Q/ M0 g                               
登录/注册后可看大图
    {- f7 x/ Q( U4 M) X0 U6 U
2 u) o4 K4 k' a' ]$ a/ l
                               
登录/注册后可看大图
        return false;, j# z. f; z* x/ ?; W9 u8 X

. |" ~2 {. Y9 f! f                               
登录/注册后可看大图
    }. w4 e% M6 }  C! N6 f

6 B6 z7 h) l2 w5 r& O0 r: n                               
登录/注册后可看大图
    return true;9 }% Q! }" Q2 U( T

1 z9 p5 Y4 f. k( h/ d                               
登录/注册后可看大图
}
# \) b; t* d* L  ?/ H

4 ]2 F4 F1 C( K9 _1 v                               
登录/注册后可看大图
int main()
9 G* \/ X! A; q1 r

% I& Q6 v4 Z2 G9 p" |5 R. L( u                               
登录/注册后可看大图
{
7 U/ Y3 z0 Y" S1 d; e. P* [3 I- d
' Z& K' B. X( ?/ t6 H  r5 N  m
                               
登录/注册后可看大图
    string fileName = "info.xml";9 b( p, d& P  k( \0 H' v3 K. h4 J
* s9 e5 z* v9 w( |
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
' J; O: @' q2 G+ ~# s0 A4 M

+ _% `! k3 y, r1 g& \                               
登录/注册后可看大图
    ReadXmlFile(fileName);: g+ c$ o$ @+ R3 f. ^- p6 T( ^

9 i2 c% C0 Y' D: H                               
登录/注册后可看大图
}: n% @4 w+ S# g0 q. z6 {4 D

) B, \8 R4 l% A8 {5 A. [                               
登录/注册后可看大图

3 S6 i1 ]7 j6 d2 J. n7 m( N% b( M% k  D% |4 Q
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
0 j& {" u; \9 v0 G$ X8 l* P; h
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了