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

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

[复制链接]

2015-1-29 19:28:56 4570 1

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
如下是一个XML片段:' @% {" [0 R# Q" X8 ~
1 x- F9 q% @4 |9 U; `' L) V, q
                               
登录/注册后可看大图
   <Persons>
* i2 v( `; V1 k$ H8 s
  r9 F0 H0 [5 U. E3 H, x) y1 \- B
                               
登录/注册后可看大图
        <Person ID="1">
( Z. F: t2 A% W! B

% _* f2 e. ^6 |& D9 ]# ~9 b                               
登录/注册后可看大图
            <name>周星星</name>
+ X1 ~! W9 R/ ]' y  t* j

& G+ ~' U* V3 `1 y& i6 Y# y& L& }# T                               
登录/注册后可看大图
            <age>20</age>% z! `- [. u- r
1 ?  H; t2 S% M  {2 s! b
                               
登录/注册后可看大图
        </Person>
6 X; [* g3 g' b7 o0 p

/ ^2 H$ g( @. A, f, E2 J                               
登录/注册后可看大图
        <Person ID="2">; b, C* o5 q1 e/ K" i8 ?) ~( q: B& p

$ ~9 h5 O9 W& ]8 \. \+ P- y, r                               
登录/注册后可看大图
            <name>白晶晶</name>; o& g  ?0 [$ M; d4 E1 H" k% c3 x) l
/ P. l; {" a3 O- X& g: {5 ^+ @
                               
登录/注册后可看大图
            <age>18</age>7 `+ @4 M0 B# S2 G; c
7 J9 A& A6 E7 L' b, N
                               
登录/注册后可看大图
        </Person>/ u+ `; S$ d: x4 w. D

2 M$ [+ M) u' X                               
登录/注册后可看大图
    </Persons>* n# Y( D" P" v) Y+ D$ c  y

. ?8 Y/ f3 M4 V1 }0 U" o                               
登录/注册后可看大图

# k, K8 I% ]5 a8 N$ _) j  y1 x
在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文件:+ {' ^/ \5 `3 `0 v7 k' {

' G5 P9 }. L0 k) P' o) d                               
登录/注册后可看大图
<Persons>/ T3 u: J3 `$ y! y1 n$ V

& A8 R/ k; d7 g                               
登录/注册后可看大图
    <Person ID="1">
3 i) v7 O3 i+ V+ r$ j
. v! w( a4 ~5 G9 H
                               
登录/注册后可看大图
        <name>phinecos</name>/ s2 c/ n8 L8 ?. v! @# T* H
, M+ x3 w2 O: v4 e* F& i" b3 H0 T
                               
登录/注册后可看大图
        <age>22</age>; f& v4 o( X4 s8 D

" i, o  t* J* o5 {& ]! G  V" d8 _                               
登录/注册后可看大图
    </Person>
. S+ p/ B+ L4 M' @2 s6 g

1 j- \5 x& c( s8 S$ K6 F9 z3 @% V5 s                               
登录/注册后可看大图
</Persons>, f. d7 ^9 j7 @6 ~6 t* o
( n7 q, {- x& g6 D/ b
                               
登录/注册后可看大图
) [/ T8 Z8 ^; F5 j
读写XML文件的程序代码:7 o: D  d7 h! |/ F; E" O

- T8 s1 E" Y' b4 J9 O9 u: T                               
登录/注册后可看大图
#include <iostream>
1 e1 K" S$ ]( S' Z" ]7 t- N$ U
1 {% _9 M0 ?0 ~
                               
登录/注册后可看大图
#include "tinyxml.h"
) |) {* {& V) r+ }. Q
* S+ i6 i+ \( Z  _8 l
                               
登录/注册后可看大图
#include "tinystr.h"# m, K" P' |" c% y# ?

! A4 g6 c4 P$ ~* P( y                               
登录/注册后可看大图
#include <string>
/ [: R, Y- v. D7 [$ j

/ p) `# @7 E' h                               
登录/注册后可看大图
#include <windows.h># \8 P, W* p! h% j- n! ~) Z
( R, G8 B; R6 O9 M
                               
登录/注册后可看大图
#include <atlstr.h>
$ {9 @* z- W  l2 v9 @+ \) o
6 u" T# v) {* v0 M% `+ ?
                               
登录/注册后可看大图
using namespace std;9 n& U3 ^0 @3 z1 Q3 l# ~& p
; j# p$ [: _5 a, k6 |" r; }" ]
                               
登录/注册后可看大图

" Y& l; L- o! l' T6 v7 |% h9 H7 q

# |+ Z: d7 w7 l7 R% L4 ^0 v                               
登录/注册后可看大图
CString GetAppPath()
  C# d% C6 X; ?) c4 E
, j* |7 x# r% _2 Q. [
                               
登录/注册后可看大图
{//获取应用程序根目录
( N% k( f0 k% m& U; u
1 b) o; [) ^5 V. S* D6 v
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
9 f/ P+ ~0 @: `/ m# A7 E

* u+ v; c! ~* U/ J0 r& |                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);0 [$ q( ~7 t& U" H% [

" i+ ~+ {7 T2 N3 q/ G; t2 p# Z                               
登录/注册后可看大图
    CString strModulePath(modulePath);
. D$ q8 |) T- q" x- W+ T$ \

" R& i4 f" M! ]/ U$ ^                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
: j9 d5 W5 C7 |7 @! J
' C& N; I9 j4 x. B" G
                               
登录/注册后可看大图
    return strModulePath;! z$ J- u& \. G# [& [/ |; L

: F! l$ n& t% {: a: N6 E  o, a" ?) g1 m: M                               
登录/注册后可看大图
}
8 V2 b  ?8 D5 S+ U4 C% I5 Z

5 f  u9 J, O6 n: l; z7 B0 z                               
登录/注册后可看大图
( E0 F. y9 h2 p/ R6 l) L
: v: ~" x7 _- r# P+ q, Z% u
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
& ?5 ^1 o- f: ^2 Y) v% ?; O* i' f
$ E  ]7 v$ N4 V+ s+ Y. B( V
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false) S9 H+ y0 Z2 P7 D, P

, ?# e& k4 G; ]! ]/ ]* t# `0 D                               
登录/注册后可看大图
    try
5 I8 O; F0 l! B3 r! S8 z- ^- I# {
; h/ }5 p  T; @# n$ N9 r2 d& X
                               
登录/注册后可看大图
    {
7 \$ h) G! ^- P8 A# i7 L  l
/ C' d6 E) [% [$ t$ p& s/ M& v5 l
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
; F7 _6 M6 v8 h5 e; C. F* s

' r+ f% c) z; R/ W                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
) _5 e4 D* e/ r4 k4 t
# j2 w5 h8 V7 }$ J
                               
登录/注册后可看大图
        //创建一个根元素并连接。
' d9 E) h* ~& u8 S2 S, X

( j: E4 C+ C4 _4 L; u) B                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
4 Q0 i. S  l6 l; Z
) S( m. H4 m  r/ J1 z* d( u4 J) l1 c
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);6 _# b6 R% \4 `, j' b/ M( v' A
1 }' E# y* A8 T
                               
登录/注册后可看大图
        //创建一个Person元素并连接。9 S3 t0 ~% h/ S5 ~: k. O
( R7 |3 F( g2 |/ Q
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");" I& @$ U% |, T& ?1 a, _

8 [3 G" a2 O/ ^0 _                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
+ \$ f; D3 c% D+ O

! H; {- C2 Y0 [6 k4 V                               
登录/注册后可看大图
        //设置Person元素的属性。" W4 R+ q" d# N8 G& ?" G3 o" S

5 {" F  s& i6 S                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
% ?' W; ]4 J+ K: B1 b  R: W9 M+ P

% l  G1 F* `8 E$ ^1 F+ o8 B/ z                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
6 F% u6 a! K$ V, G2 ]& a4 f3 L4 ]

9 b0 O) R3 \6 P$ k) l6 D                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");4 R! O5 _. e, q

% l& N# t8 C% W                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");! K! K3 f  P: `6 ~8 J

/ U! K- x, j( K4 A6 s$ O                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
/ y1 b4 ^6 g/ J5 M- b$ T8 c

0 c: y2 H4 L3 `. ]                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
; K7 l. A, T0 l( r% G
# D. O$ a! Y3 T7 G/ w# @% k
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
1 C* X# W! C3 H) b4 H

; }* }: o( p- \: k7 ]+ |                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
- ]4 `$ U3 c- L& k) H
0 z0 s9 }- Y8 R/ W) u2 w$ e. O
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");+ l$ O% X9 N  }1 L: i

1 p" ~% ~, [  N* U2 `9 ~: C                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);6 F& v- l7 x+ U/ f+ s( ~
! Y2 H$ t$ M) Y# g
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);$ G$ C2 o1 i, _# q% N' L2 T% l

& U$ f' Q7 J6 c% ?. p: ~- O                               
登录/注册后可看大图
        CString appPath = GetAppPath();& S/ ^1 h' {# G5 x" C" X

# Y; r* H+ y/ y                               
登录/注册后可看大图
        string seperator = "\\";8 }" e* n: W' a5 v. m6 T

' F- C) S% {; n* D, V1 g' I; S                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;' O# J" x; Y5 ^( v$ }
# F$ `$ A9 g; U7 Q8 ^5 N1 u
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
( @8 r% G" I- B) l3 k7 ?
- W$ ~. P5 B. ?9 A
                               
登录/注册后可看大图
    }* n9 c! g( J3 l- a( e) c

4 f% i  x/ Q) l2 S$ c* [& _! F                               
登录/注册后可看大图
    catch (string& e)
; M& U3 w4 u  r4 x3 r; `% N

; ^! d3 F: U! f% ^3 X                               
登录/注册后可看大图
    {5 \2 z+ U3 w/ v+ a

' a% t+ n( X8 O; A$ [' r( {* V                               
登录/注册后可看大图
        return false;
( {/ f: w7 y0 c7 `7 v5 D- _% Z
. S1 @& ]* I0 Z7 E3 `/ ~5 N$ T# J
                               
登录/注册后可看大图
    }  s  D' `6 |, I  J4 G

2 z0 l2 o' J, |1 c                               
登录/注册后可看大图
    return true;1 _: [, q+ r4 a2 M5 q
; h8 z  B6 @1 [& G& G  z/ N
                               
登录/注册后可看大图
}
( _: b: ~; \8 d9 c

! Z: h% A8 f& ^$ N                               
登录/注册后可看大图

( p2 O, M& t8 ?, c: ]" p

, g! R* X& z( y( y  w) c0 S                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)! c& t, Y4 D; A

) p0 H3 ?- o/ ~                               
登录/注册后可看大图
{//读取Xml文件,并遍历
! j0 ~# r' m) Z; X- V
/ f# M" o- t7 o1 K8 w; Q
                               
登录/注册后可看大图
    try
- R7 Y8 `2 N+ e' @' p( j
( e% G4 A) G7 q
                               
登录/注册后可看大图
    {9 S! `3 N; G* m  M
( s( R. F& r9 W
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
4 l! [* h+ i6 k  R5 g
3 D6 }* ^6 a- S: O' H& S# u4 N
                               
登录/注册后可看大图
        string seperator = "\\";
/ a: j- o! j5 T' q) _& h! R
: n5 y8 }; C3 o. [
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;4 T8 [$ B- _$ ?% U% l5 c+ N* T

( u9 g3 Z0 s& P+ ~4 V; h                               
登录/注册后可看大图
        //创建一个XML的文档对象。
  y4 l5 n8 `* k$ Z
0 g! V0 H# M+ z/ N
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());( f1 |, c$ |! K

% _/ ^5 L: q& d1 B$ |                               
登录/注册后可看大图
        myDocument->LoadFile();
9 V+ B. `$ k/ D. ?# O
* S: `+ ]0 D5 W/ I  M% u
                               
登录/注册后可看大图
        //获得根元素,即Persons。
6 h" G5 s7 Y  g6 i% r0 s& ?( p

- L8 s) V4 ]9 H& ~/ t                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();$ I- @$ b( n3 v& G3 B2 X; g' x

  x0 w! G; e3 ?$ O# p                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
, S0 g; y5 ]( m% h* C: C
, o3 I+ a9 S; ^1 I
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
6 x$ i2 a% _$ I! H
3 Y9 y  B; t  U  G# s1 a# g2 V
                               
登录/注册后可看大图
        //获得第一个Person节点。/ a$ A# z9 `+ t- A( |' M

( {8 I  t4 Y' j+ ~; o4 z' |                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
% Y0 v+ N8 N2 a) A3 G  H
# ^& A1 S6 Y! q: G# @5 s4 \
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
  f/ M9 E! ^5 w1 [8 E1 Z

5 u' X2 I; b0 |: S' a- ?                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();& T& @9 I+ x, r  M
" i; E; ~8 G1 @3 w# E5 p
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();5 V4 |$ }, s* \- z1 K

; m" ?0 `& i/ V; c& e2 e                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();% y/ R* Y; {5 A  R# x" x

8 b1 N. C  o& n9 T" j/ {9 Z                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。  k  n' X. S1 S5 x

) E! s$ m, I3 ]3 k                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
  s5 |+ x( W, }* g9 m$ W. z, j
1 J7 l3 N/ o% _* `) f
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;+ Y( H0 _& k. M+ K; |0 M" A4 U8 s
  l, {# ^- Y/ `2 V9 n: `4 E! P1 D
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
- V. L% O- v  v( k3 D2 S( A
" f: t7 ^& E. d' R% `' k
                               
登录/注册后可看大图
    }
, ~# x7 u- s. h1 e( T

) c* {9 |; J* T. _) K                               
登录/注册后可看大图
    catch (string& e): Q1 K# P6 \" \# A) F

* v4 ?1 m* R8 p5 O4 J                               
登录/注册后可看大图
    {
  F) v7 d) S; X: h0 K1 ^
+ `5 @: h) H5 s2 j7 h- U
                               
登录/注册后可看大图
        return false;9 P  O1 Z9 L' h* u! i

, V  h& o1 K0 Q. P  O                               
登录/注册后可看大图
    }  R- ~- P" {4 I9 S, \; N
/ e7 A# b( v5 Z$ h
                               
登录/注册后可看大图
    return true;
' g8 [6 n# W3 w5 f
1 f4 G* z) k% O0 ^' d, {
                               
登录/注册后可看大图
}' I! N) W2 B% @- e% T4 d% k( ^" I& K

; c# H9 E1 V3 [0 K- z                               
登录/注册后可看大图
int main()
' h. Z; q8 K/ I/ G! g/ D4 g
! D8 S# {, @  d- g# J$ o9 c- ]" C
                               
登录/注册后可看大图
{
! c' o/ G/ g* F0 a! R: U

& \! I; b; `9 ?3 w0 M                               
登录/注册后可看大图
    string fileName = "info.xml";3 k! T4 P  {$ y* H3 K

! Z. b" R. @; _" |) @# A. }                               
登录/注册后可看大图
    CreateXmlFile(fileName);
% k1 H. ^0 e+ y

" C% x! [1 h( E7 F/ U  `1 K                               
登录/注册后可看大图
    ReadXmlFile(fileName);2 _3 l$ _, f: }; v1 y! o
7 a7 J% P2 O$ r( I- j6 [4 f5 V
                               
登录/注册后可看大图
}
1 D0 y$ O/ @9 U  \* s& I: U
0 I* S6 z. I( E5 s
                               
登录/注册后可看大图
$ E$ X* U. ?- q3 g/ D

7 I" v0 W& e$ z8 e! a8 `
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
; I" @( }1 [& j' W9 W  j
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了