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

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

[复制链接]

2015-1-29 19:28:56 4370 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片段:4 e  D, D6 w0 U5 d/ @1 y& e9 d

; o- A# t' [3 v2 K4 g$ B                               
登录/注册后可看大图
   <Persons>& T" P# w/ _9 M1 ^8 W1 k8 k
4 p* p% }9 J; I+ a
                               
登录/注册后可看大图
        <Person ID="1">3 i0 e9 P, _7 M& {7 h: g2 g

" k$ i' B" q& u* g                               
登录/注册后可看大图
            <name>周星星</name>
# B+ V; e! R$ k) d5 {1 x! p, [! D
4 W) A" ^6 H' d/ {5 v! q. J" F, M
                               
登录/注册后可看大图
            <age>20</age>: ?2 z$ B, x% t/ a4 m/ H: J1 k, R

6 v( l: u& o. e: B                               
登录/注册后可看大图
        </Person>4 u4 ~5 d2 ~( ]& T" h5 Z

5 d) }9 X) t9 Y8 t2 H- E                               
登录/注册后可看大图
        <Person ID="2">/ l% X& C4 k! k

) i$ I# @/ w) B# L1 O                               
登录/注册后可看大图
            <name>白晶晶</name>
* H1 l- z% b' g: I  e* m0 @

1 ?2 ]" y9 n; d6 r* k6 m- e# k                               
登录/注册后可看大图
            <age>18</age>5 @5 h: {2 C( A1 f. F: p0 w

3 `: M& f& K) ~1 x+ [                               
登录/注册后可看大图
        </Person>6 Q% u; _) x2 b/ _7 g" C

" T) T" T* z: N; H. ?9 @# \                               
登录/注册后可看大图
    </Persons>8 R* ]4 S- G' ~' n) ^/ b3 K
2 d" F7 D' }# I3 {, ^. m
                               
登录/注册后可看大图
' J5 a; b8 J; X% z
在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文件:3 ?& }1 j- L% F# t4 ^- L
) ]9 B6 a# I- \
                               
登录/注册后可看大图
<Persons>
) k" P  ~0 L/ ^% A# p
' |2 y) C) F. G6 C- `* v: }' n
                               
登录/注册后可看大图
    <Person ID="1">4 u  I( u3 O9 V  P, f. H' u9 D
$ t2 o$ l" q) V* u
                               
登录/注册后可看大图
        <name>phinecos</name>5 |( w9 z" d% v" }9 S! P

, a; C' n% |- E                               
登录/注册后可看大图
        <age>22</age>
- o& e# X9 ]0 I' \7 A
) |8 H8 p: }: ]' G/ _. s! [
                               
登录/注册后可看大图
    </Person>* K3 V. A# T7 g) V2 E2 {' J
" p& K% `' M( _- B6 k
                               
登录/注册后可看大图
</Persons>
6 w! d- m& L' D' k. `$ k
+ M8 o2 a- \8 x7 ^+ I: F
                               
登录/注册后可看大图
; l, _+ a  V  n5 z+ a+ t& t/ R, z
读写XML文件的程序代码:
& w, S2 ]7 U& N& g
: t2 a9 a2 i( y0 Z8 j
                               
登录/注册后可看大图
#include <iostream>
: \  ^. \- Y$ _, h2 H* \

/ X% X0 o6 h/ E- H% V' W                               
登录/注册后可看大图
#include "tinyxml.h"7 h9 u$ b4 i0 V, D: B# b+ P
: B+ w$ ?. E3 _
                               
登录/注册后可看大图
#include "tinystr.h"/ c/ _, ?' U$ t) f) {' E

- s: w/ B3 j+ n8 B                               
登录/注册后可看大图
#include <string>1 u! j9 W* I1 i# T! `  }- H

" \. q; w7 A4 a* `% U7 H                               
登录/注册后可看大图
#include <windows.h>! B1 y/ v& Q3 {: H6 i0 A, Y+ I$ W
# q; S5 V6 Q/ C. E6 z- N9 g: ^
                               
登录/注册后可看大图
#include <atlstr.h>3 T# r6 _1 J9 J2 o7 T$ Q

7 M8 f0 p$ S$ D3 x* i5 s; [                               
登录/注册后可看大图
using namespace std;
; u% g& q+ O# s, E2 N* s
/ r4 b9 C7 l8 Y
                               
登录/注册后可看大图
7 r! X* H- |$ z

* l9 [& f5 K4 k  p3 j                               
登录/注册后可看大图
CString GetAppPath()6 J) ~0 [: K# G( Q# J  n: u
3 U0 M7 ]) _" [4 b
                               
登录/注册后可看大图
{//获取应用程序根目录
1 j7 {  a9 [, r" z
* k) S+ I) C1 K
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
" Z" _% G/ L$ b1 \( x/ ]3 T

2 t0 U3 d0 h9 e; ]4 Q                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
% r) a+ V$ G0 [8 t/ |

* x9 a' J% G+ [6 Q/ W                               
登录/注册后可看大图
    CString strModulePath(modulePath);$ v! S6 J8 n  I* Y6 N- b* N
' K' W4 U  t" L3 ?& d$ _
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));/ K6 r! L# z+ P8 u
8 ~% r- ~, r1 C; i
                               
登录/注册后可看大图
    return strModulePath;
) w2 P" l( [  e% R+ V& h( v- }

8 y# v; _4 U3 ]3 A  ]8 {- G                               
登录/注册后可看大图
}
5 r( Z7 d8 Z! u; C; x/ P

7 K+ I7 r* O+ }2 |4 }                               
登录/注册后可看大图

7 b! S1 @, L' T! }! z$ g3 |

( Z9 f+ o6 `' G! S% I                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)- V8 h+ H  \: |* i- g

, A" U6 p7 ~, l+ v& {2 A: p* r                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
! g. U' K/ |/ [" H7 n1 y: d4 V2 e3 R

. w, }# ~$ G2 H% V1 T9 M( X                               
登录/注册后可看大图
    try
" N2 B2 [4 [" Z- D* F

- l6 E8 e5 T3 W' D( E                               
登录/注册后可看大图
    {  T9 c. r' S7 \& e1 [: K

- k' P; F8 a- p                               
登录/注册后可看大图
        //创建一个XML的文档对象。
3 Y9 _" z5 _4 p+ D. v

; @! v, ?0 j9 ]3 L8 ]                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();/ {% D- Y. x) o8 K

) }5 N# B- M  u$ n. u% L                               
登录/注册后可看大图
        //创建一个根元素并连接。9 _/ i5 y! T# H$ o0 S0 t

& f7 r% q1 p1 x3 r7 u                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
) H" P/ z& w9 G
% U$ Z- p6 D* Z9 l( Z( O
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
1 _. B+ c% f9 H! F6 N

$ ^# J! f5 f; A1 L  C                               
登录/注册后可看大图
        //创建一个Person元素并连接。& Z6 D/ B: W; D/ V# {' s
: ~/ A3 L! u! H3 K: n' a- F0 r
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
7 v' q* m( W* ?& |* `# N

3 e5 q" @$ Z, S! X5 l$ u* P* ]                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
7 q; \3 }* A+ O! r& M6 P

$ j4 s2 V1 o7 M* t- s8 {                               
登录/注册后可看大图
        //设置Person元素的属性。4 ~0 k0 }$ |# i2 c1 I5 w! ~
* ^6 i: i; W: ~( N) k, Y7 G$ ?- b& S
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
* c& b. K7 N8 z9 v' L
% Y1 h: S7 H: A. q6 T" P
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。5 k. l& X/ ~- e( W

, ~9 v' ~2 G- K% P9 d- E                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");! Y: z2 K, t. L' \
, t  {, m& G0 \6 n$ z) O$ G7 H# H
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
, O3 E0 W. g) T7 N7 J& L2 N
3 t9 |/ h0 [4 \7 h& N# i# L
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
8 U, C9 X1 G$ ^. i
6 V) t5 `3 Y& C: e
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);$ I, i5 s4 a% k

/ p! S( A" Z! \$ H+ N8 |+ d                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。( M- p$ P) E2 ^; M7 [* d5 ^

' O/ j) E2 Y. d. ]                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
- n$ W% ^3 T5 b1 k) k) v, T7 B

4 C+ d6 R* a1 b2 g5 Q+ H! Z                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
$ h% m1 J. V; Y$ S
  w! z$ ~- J: _9 @8 K9 c
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);1 x3 T7 @! e* P

" e% |8 G# i3 c4 P6 t  H# a                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
$ T0 I( X7 _. J' W
( [! H" {3 H2 h# e+ _+ `% `. g, F: _
                               
登录/注册后可看大图
        CString appPath = GetAppPath();2 ^. {! s1 R7 ~
& |! L9 x- P8 @* b# m" u3 g
                               
登录/注册后可看大图
        string seperator = "\\";" w9 q2 D5 B8 H6 F9 {! X5 s; F
  O. b; o* F, ^, j% t. d
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
0 h8 A( x1 R; b0 ^- I2 g
8 l) Q8 r1 y! B$ g' `+ ?
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
: ]3 {9 `- \" l7 C/ P" N
8 F* r' ~4 a0 }( l
                               
登录/注册后可看大图
    }3 p$ f% }) f/ ?- ^4 I6 T

4 |0 _3 m4 |( f4 U                               
登录/注册后可看大图
    catch (string& e)
6 \+ u. t/ o. @  t

" O- E& S  z; _) K2 K' K                               
登录/注册后可看大图
    {
3 X3 r; B; [) y3 f/ s2 O

  w0 G# [/ B, H2 M1 V                               
登录/注册后可看大图
        return false;
- o/ O8 H3 }) q+ N$ g/ Y
9 l, u7 c0 y' @8 J' a) X! d, a* T' Q5 _
                               
登录/注册后可看大图
    }, N6 T+ K1 ~) d1 |
: W4 m0 H! G) x9 C8 X9 W. G2 [0 G
                               
登录/注册后可看大图
    return true;: f4 n3 P5 D% s1 H
/ i* n7 Q6 J" n6 d8 c$ ~
                               
登录/注册后可看大图
}
2 z: \3 f1 a1 q  b2 s! _2 O
' z2 @, c6 K9 Y  ?* \
                               
登录/注册后可看大图
. p# v1 F9 U0 P2 P
0 A! m- f3 }" {
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
7 {- ~. X+ A& ]: m8 U6 m
/ D7 z" W- j/ I6 k6 \2 j
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
; N3 ^2 z" Z0 [7 H+ f

% c1 i7 L5 u8 f                               
登录/注册后可看大图
    try7 q. b& r9 h$ c3 g

1 w5 q- ^, Q* K& h! u2 Z6 R                               
登录/注册后可看大图
    {
6 Q; \9 g3 B: Y' H$ e; W9 q7 g
- C& T2 W7 X. O+ Z5 E
                               
登录/注册后可看大图
        CString appPath = GetAppPath();7 t  }( x) f9 W4 k. `# e

4 S* |1 u% g% F: d) N0 Z9 \                               
登录/注册后可看大图
        string seperator = "\\";
* D  Z5 P% Z0 @7 P# y6 u
: {- B/ g% `9 u. ~( k+ O
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
- }0 d, a5 @5 s
: t% r0 J; Z& W) ?7 b! L
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
6 Z& n- ]& A% q( a% \

4 o" C3 E1 I7 z' P3 |                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());2 B% I# R9 R. d! N/ `! r" J
* D+ K# I! ?; c6 G- I- _7 \/ F
                               
登录/注册后可看大图
        myDocument->LoadFile();6 i1 k" j, F9 \7 X

( Q4 s+ C- c& r" y. v" l                               
登录/注册后可看大图
        //获得根元素,即Persons。' A# X/ @2 o; v
: v  D3 S1 {4 G+ W$ s) X+ v$ K% {
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
* s* d1 m9 k$ k1 Z
9 I0 |  l! B7 w
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。3 N8 N/ `0 K1 `4 z# Z; }- h# `

$ z- A8 P3 N/ x) z& t  Z                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;- v9 A3 i' n, H2 e- d# y, M& k2 Y
7 S0 V3 V9 X. ^
                               
登录/注册后可看大图
        //获得第一个Person节点。
% |) E6 @1 g3 e; r8 ]
6 N' j& Y$ V2 P# m8 B: S
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();' o) L$ x% _! t+ G
: u: L+ [3 F' e1 I* @6 N
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
8 `2 g3 D7 Q: p

7 N2 b; i! [7 a  P- Y" k: `                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
2 ^- u; ?& i7 n/ P5 D0 @

0 o) B9 j, b" Z, r# _                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
3 l; o8 {5 `, x" ], B0 }1 D" @; ?* r

* F9 g" _- e7 D; o5 b$ p                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();4 ], O! Q% P- U' e& B: C) P2 H1 X

9 g$ j! p5 p1 j, j3 x                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
) g, N" g7 n. i) C7 C! I) H
5 J$ |) m! e' X+ b4 i$ H
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
) n9 E" C+ J; M3 P+ M6 n; J& o6 l

: {9 |" Z9 F3 D                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;9 y8 A& f$ r: Y: n- F% A; z

; @* ^/ M, x) j2 d                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;9 y/ Y* O' q4 t2 u
. t# x8 h1 M1 r& h$ l: d* a$ t0 Z
                               
登录/注册后可看大图
    }
; P" Y0 Y2 H. J% T$ H# m9 R! }1 ?

/ G  h% j3 Q9 L* w* j; K+ }) i+ ^                               
登录/注册后可看大图
    catch (string& e)3 D' D* q5 ^1 A& u, u( t

' b+ L( q0 v+ s8 @9 g                               
登录/注册后可看大图
    {
0 F7 m( Y3 o2 z9 l- g/ _% p8 ?
) w( V& ]- \" t# \0 n7 ?( o
                               
登录/注册后可看大图
        return false;
3 `  U" t. Z/ e' V* |, n
0 @" K$ \) A7 R; p8 G7 Q% y4 k
                               
登录/注册后可看大图
    }
) H4 h9 s3 t  M7 K8 P
' Z, a8 B3 N9 O) d% O0 i7 M
                               
登录/注册后可看大图
    return true;
3 e3 s4 Y: o! y+ }' V0 j/ ]
- X5 n7 O  |) ^, E: T
                               
登录/注册后可看大图
}6 V" Z* `& c4 M) V, _( e+ N
+ c9 \3 n! C2 F$ a. I
                               
登录/注册后可看大图
int main()
* d4 N% L7 }. d2 r

+ W5 Q) L. a- [$ [# N8 S                               
登录/注册后可看大图
{0 a$ z7 q" V( O4 V' ~, X% [' y0 F3 L

8 r: e' H* Y% j9 W9 ?2 n7 S                               
登录/注册后可看大图
    string fileName = "info.xml";. i2 O3 Z8 i' T, ^
, ]$ b; g8 ?( d; h; V5 w
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
7 D4 C) L0 L" y; J  F3 m

  h( e; E, `7 L* Q4 k2 G6 H                               
登录/注册后可看大图
    ReadXmlFile(fileName);7 x9 L, `4 t* o; Y' k& h- X4 u9 A

; Y$ n$ _, O/ W: T% l                               
登录/注册后可看大图
}
% o! g: V* V' @$ r; a4 f7 B3 P
! v& R) {9 w% X* c
                               
登录/注册后可看大图
3 [5 E; D; j+ S% Q* h8 a" [
; A; C" x5 |; `7 ]+ A0 \
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  5 D* y3 @+ h; x; N6 ~: e
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了