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

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

[复制链接]

2015-1-29 19:28:56 4533 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片段:
- g  [/ H, S3 {9 o/ {

9 f; u0 x" E! D, e) ^% i! r1 U                               
登录/注册后可看大图
   <Persons>0 F, s  Q5 X# F# e$ H; L

& T# x! f8 Z4 t                               
登录/注册后可看大图
        <Person ID="1">
5 t/ w. D* V& j1 j( `

# G- K4 ?- Q8 F, R. c                               
登录/注册后可看大图
            <name>周星星</name>
7 D1 L0 U; e9 b4 N7 a

! z2 ~+ R$ K5 z0 o$ l                               
登录/注册后可看大图
            <age>20</age>  O, C0 q/ P  r1 E) n# G: h
3 H( f% R( X% }$ h& [
                               
登录/注册后可看大图
        </Person>
  ?& A$ R0 k7 e) I$ L& v4 X
1 H! S/ j" [% [: Y8 P6 x) M8 u
                               
登录/注册后可看大图
        <Person ID="2">
- H/ F# \/ g2 p: F7 A: D; E
4 I: W) M7 X+ K# c4 \1 l
                               
登录/注册后可看大图
            <name>白晶晶</name>* `+ i9 A" a, j% H2 g. H, G3 B9 f
# \+ x- ]1 B# R% R
                               
登录/注册后可看大图
            <age>18</age>
3 @) ]( |7 [8 Y

, J" }9 H" D( @# m' x                               
登录/注册后可看大图
        </Person>
) y6 ~% o- o0 q

& Y, Y4 r9 V( A, g                               
登录/注册后可看大图
    </Persons>
, ^& t. c+ v! Y) R
# J/ ?& E: f, p# Q3 a5 L+ D
                               
登录/注册后可看大图

) {7 h6 \  J; M
在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" j- o: ^$ U9 C- Q

0 K! H# h1 R# m                               
登录/注册后可看大图
<Persons>
% p  _8 i+ g: |& v" i( p! e
( n" e. `: L1 J# t( e
                               
登录/注册后可看大图
    <Person ID="1">; A) Y, H- C8 N* m$ `# p
% s* a- s6 W; u, j( x% D
                               
登录/注册后可看大图
        <name>phinecos</name>8 r  ^  p( T, o

' E5 x0 [; X8 U, d0 ^                               
登录/注册后可看大图
        <age>22</age>
* e6 \" P2 e, i8 k

5 D9 N" a$ o! u1 E  K0 P: J! z                               
登录/注册后可看大图
    </Person>
. w( [5 }, E. A- l

& u0 ^# H$ K2 S6 [4 |( m: N                               
登录/注册后可看大图
</Persons>3 V& G8 l5 M0 b5 M5 Y

$ V# P& `# f+ h+ g8 B                               
登录/注册后可看大图

; B7 f2 c' d) Y2 [* _7 T
读写XML文件的程序代码:
; L* `- z, A& X

  a5 o8 k- n" g4 `' V. d2 A                               
登录/注册后可看大图
#include <iostream>
& t+ K$ h! ?. W  o; o

# Z! q- ?, B7 R" J) G, j3 P, k                               
登录/注册后可看大图
#include "tinyxml.h"
: d9 B# W  y) w1 G" a

# I% y4 I6 Q! N) T0 p# ^                               
登录/注册后可看大图
#include "tinystr.h", T! g% I+ M  }  W. b' @
0 V% f& u- q+ G/ \6 ~, G
                               
登录/注册后可看大图
#include <string># O( A! @. V" T$ Q( j

" i& g! O2 W+ ?9 c2 g6 [                               
登录/注册后可看大图
#include <windows.h>
5 \, l) ?: ?4 k
* r7 z2 a0 J9 G) N+ r+ }8 m/ o, L
                               
登录/注册后可看大图
#include <atlstr.h>( ^/ y; }% V0 Y4 W8 u- h' r7 q

$ k( g0 e# n% n/ E3 G4 D8 l                               
登录/注册后可看大图
using namespace std;
0 U. e( v! E9 S6 d/ U: j

/ Q1 @( j* h" A" j  N                               
登录/注册后可看大图

! g8 ~1 k( m6 E9 w4 l! R( `

8 m* o! a( G8 z" S. C7 {0 L0 A                               
登录/注册后可看大图
CString GetAppPath()
! z2 }/ B8 M" L1 E

2 f! K8 z6 o7 \% A0 X  ]' i                               
登录/注册后可看大图
{//获取应用程序根目录
! [' ~& v( F* k( ], e# `, B

* {8 D$ K1 e2 P& y                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];8 @3 @7 ?- ?% Y' h' P
- e* n! J3 z% A8 c( Z
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);9 ]( o/ U+ a6 n% o2 k! n3 x& M

* ~. n7 j' z8 u( `' f4 L                               
登录/注册后可看大图
    CString strModulePath(modulePath);
  o: }' k$ l- e8 R$ o1 l

7 d1 Y( v9 Q! V/ H; `8 A                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
7 Q% M6 N/ r  W: g. v
( X* O0 U! j8 Q! L1 F
                               
登录/注册后可看大图
    return strModulePath;
" O' A9 h$ N' M9 Y
: p( ~& g4 l# C/ X; ~0 Q( y
                               
登录/注册后可看大图
}6 {' N  z! Q* y1 w5 o

$ x( w1 `+ W4 J                               
登录/注册后可看大图

! I$ n( F4 L" B2 u  n# H5 f
5 N/ I) T5 g- g8 o8 m* a; X1 f
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
& v( q2 G5 N2 E

  `5 h4 @; ^& i+ {* k4 I& k                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
- x* k3 J+ r9 n
! a2 u4 F1 I! ^' V$ ^
                               
登录/注册后可看大图
    try7 k5 t+ Q8 y+ _$ X" F

5 b) \5 U  s3 q/ |0 f* d                               
登录/注册后可看大图
    {
& L( A1 s1 e2 ?. @* I

% C: R& l4 ~9 u) Y                               
登录/注册后可看大图
        //创建一个XML的文档对象。
% M$ F( s2 y& ~: l- F! L

  k. F1 @, M! ~* \! Y                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();- Z' m3 J5 B# R$ C: q) m

( h0 }% a# J- y9 [                               
登录/注册后可看大图
        //创建一个根元素并连接。& I, P4 l7 f  r( _8 f2 K
, t) `1 F; J0 O$ `$ }# X; I* {
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");5 u6 x) H$ _. r4 [
% }! |% G7 |+ K. a  X& x3 e
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);% h: F0 G1 _3 J' }

2 \- Q* K3 [/ h' J                               
登录/注册后可看大图
        //创建一个Person元素并连接。
' p$ z$ h, H& u
  V. i* G7 p$ e% d' K- o
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");! Y7 V, |6 f; B% G" s
. _% S6 u' n3 ^
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);( h0 {# y% @2 w" S& e3 C2 s
9 S2 v7 s  ?5 \7 R9 J
                               
登录/注册后可看大图
        //设置Person元素的属性。
7 X0 V/ b. q7 b& j, g1 m
8 m: K4 R+ D8 S2 L& ^& A
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");3 \* n9 c! L; C

1 R2 h$ X7 k) z$ R& S: I                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
$ {/ j8 g  ~. i+ _9 J
. I5 x$ o" j$ ]" F' x& y! n' t# e$ I( W, D
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
" d# d1 I& o+ d$ U" L- y
$ S6 S$ v4 r5 J' F
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
; e2 R! |1 e% h1 h+ _: ^/ \7 r; a/ [  J
1 }- \. \* V' c! |# \
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
4 e2 W. X0 D: }; [
( r# c- V( c2 W
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);. O8 X( V% E3 i! F/ j

8 A% u! }( B( b/ [" j: D                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
* p! V; J: K1 Z9 p

) x5 A% g, L, Z' C                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
* h' Z8 A% a% A% z- ?1 O* O
! T# e$ H6 Q  x
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
" L8 Z' I( v+ q0 W
2 m% Y& s( b& \& `# J
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
5 t( a5 d; n+ q! `

4 p5 V4 f5 o, i/ A0 N                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);  d) Y0 J& V% \, X7 {0 T6 A6 _

; ?  l! Y: r, E3 ^                               
登录/注册后可看大图
        CString appPath = GetAppPath();
$ ?. G# t7 X6 [: f4 i: z- G1 }4 R0 e
) W7 j* U6 N$ y' e2 Q1 d
                               
登录/注册后可看大图
        string seperator = "\\";
+ r% I; D4 I2 r# L* _: C5 y
- Y/ v2 H" I# L
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
- ^: U& T0 S" V8 J1 B9 ]8 T+ }6 q

8 x; {1 w. _' K* i# l3 v                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件- C9 n4 d9 S" E: d+ r# j+ X! f
; x% l- g6 V; n" g' I
                               
登录/注册后可看大图
    }" U5 Q0 c4 E7 a+ W, v0 Q- H, e% q! _

5 l6 R$ t6 \4 C2 j                               
登录/注册后可看大图
    catch (string& e)$ y$ C, C" {: d

1 b. K; R* s* h1 ^                               
登录/注册后可看大图
    {
$ R% z- g  D+ j9 P8 ^
4 t6 B3 t. Q0 m* d
                               
登录/注册后可看大图
        return false;1 k7 D+ ^, K. i( S$ j7 {5 z0 ^
- F9 N" S) R. X- t' _+ J6 w
                               
登录/注册后可看大图
    }% |2 h% O3 g  p3 h7 S1 s
" U/ b- U6 W$ [0 R
                               
登录/注册后可看大图
    return true;& l$ g5 X- {1 w* U3 f- p
5 k2 B" m- d  C" x) n, r
                               
登录/注册后可看大图
}
3 u: o0 u1 j; Z# g4 R
1 h7 D) _7 T; F9 O
                               
登录/注册后可看大图

9 j& \1 W/ a3 k: Q' }+ i! x+ w; _

( W6 y' k* H4 J- }                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
2 H2 v$ E" \4 k% i4 d" |+ R5 D, I6 ?$ }
! @- g: z  g  q' ~( h
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
( a0 Z9 M9 s6 i8 Q
# v. r0 D8 _* V4 y% C. p: t6 l
                               
登录/注册后可看大图
    try$ `( B$ W* A$ h+ F4 h3 K
1 w; t9 v" V- g2 V
                               
登录/注册后可看大图
    {8 L4 x# ]' f8 v/ ?& q/ B& b' y
4 h( {/ Q$ `9 Y5 D3 F1 l
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
7 A; m, N2 n- s. H2 E8 R7 L
* H7 f: u0 K, \, ]
                               
登录/注册后可看大图
        string seperator = "\\";8 D7 K# ?) _1 b: |$ P
" c0 k- R5 y1 p9 L6 B* a
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
: r* C0 b* Y7 d+ k! y/ ]% ^

, G5 N$ l7 C& m! G! h                               
登录/注册后可看大图
        //创建一个XML的文档对象。
, j& x2 H* @9 C6 \/ d, o8 q

0 w# ~) ^9 Z% A& l; W/ [9 W& Q                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
4 X8 y& a8 S6 @. Y

5 H* e6 _0 Q1 b. Y6 T: h. \8 V; K# G                               
登录/注册后可看大图
        myDocument->LoadFile();. R9 T" e1 d: V' |1 W, i% Z

4 I! R  G+ a# M! Q                               
登录/注册后可看大图
        //获得根元素,即Persons。
# \2 H* J6 x: a) t9 O
; T2 J& \; u- `  O7 l) _9 C
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();  q: R8 N: c) V7 ]
+ e' t" e) d9 S; O; I/ |" |1 y
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。8 x" r( r1 p5 k4 z4 m( e
  D. I5 B. n0 O. T2 D% ^
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;, T! P! V) L' o# A! h3 M+ E
  ?  u, f( ?) B* [/ h7 |
                               
登录/注册后可看大图
        //获得第一个Person节点。
  i+ q- p/ i& _9 I, j

* b. W$ I+ L' Z                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
4 J! b) P! n/ v( |4 Z3 Z5 {
) g' y# A  n+ y
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。% J% u  y+ c. z, H

9 Y+ i  X0 S. a/ v/ T* A                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();8 g* E! }. y: J% R& A
' q( o* t5 y1 c% M% W4 o# f4 \
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();4 X9 V, C- c8 s- Z+ R1 V

+ Q/ r! l' h3 d1 j* e                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
) H2 }) j0 l. A* Z+ ^  C
' B0 j4 Y7 b$ @8 V7 T* O( }
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
" x! {/ K2 r  I" b5 j5 y# j
! u/ \* l' i. z. D) P
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
# h' n& H4 v* x! Z' @- [
' O& |7 U: t' Z6 p  [& [7 {
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;2 A/ G( ^3 F% l/ {9 l0 D

" c( x+ w: [9 u* D1 O1 y- N* v                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
1 v( M+ C1 W$ W. H. G2 z! b# `+ N7 ~* c

% D7 F- C4 _2 y& b1 _0 p& Q$ s                               
登录/注册后可看大图
    }
- R$ B- u# D6 v; y9 M

3 K% _# |- D: j; ]5 R                               
登录/注册后可看大图
    catch (string& e)* J. u  e  y* G
: T* b4 X( m, Q& Y3 O) d3 K7 T
                               
登录/注册后可看大图
    {
7 D' z, B0 q+ H* f  x) G
) O: s: M  E: |, `. ~
                               
登录/注册后可看大图
        return false;6 O% O, Q( b/ z# R6 v+ @( p
5 V* a9 D3 _" I0 W( p
                               
登录/注册后可看大图
    }/ c: Q! V$ C' K) U$ u4 B
8 [" M+ u! M, a
                               
登录/注册后可看大图
    return true;0 T: k4 Z+ G7 B0 I+ q7 t9 u
. v$ r3 m+ w  i2 ]7 f. C
                               
登录/注册后可看大图
}& \* a$ v. j( r8 m/ [* a) q
" Z" y( g8 _3 a" B; t; S
                               
登录/注册后可看大图
int main()3 j' a$ F0 G9 }+ x3 q

% P. P0 j$ K, F0 y7 [                               
登录/注册后可看大图
{. J- A: o8 L6 a

9 f2 I* r1 [5 V# }                               
登录/注册后可看大图
    string fileName = "info.xml";0 k  R7 q% h2 W7 z1 f

1 K" P$ v& t, B. @. Z2 e( E                               
登录/注册后可看大图
    CreateXmlFile(fileName);) R3 ^- K$ a- o. \( V
! y7 s* s7 H, ^, s
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
( i# [8 _: W. ^, m$ o
# n4 n( C+ @9 |
                               
登录/注册后可看大图
}
/ D& T4 V& t% C( x, n( ]
. B+ W* O2 Z) k2 M
                               
登录/注册后可看大图

& }2 O/ J" W9 ~) l1 q7 F  s& D5 Q1 R8 R
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  9 F1 P0 \* K7 H. k6 ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了