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

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

[复制链接]

2015-1-29 19:28:56 4422 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片段:
3 A: h: A8 d/ B

; j# s1 K; W" ~                               
登录/注册后可看大图
   <Persons>
4 N' K! \# g7 L8 \9 H
% l$ h2 a9 j# w4 U8 V
                               
登录/注册后可看大图
        <Person ID="1">$ I3 [4 B! `+ E8 A
: }! E6 h1 v  u; F7 m  u$ j  H+ c' \
                               
登录/注册后可看大图
            <name>周星星</name>7 @' B' _( Z, [' Y
$ I4 @' x3 p; Q" J' v, \
                               
登录/注册后可看大图
            <age>20</age>
) g8 `9 z& {5 `+ G

' H5 ~7 m& i) M7 ?! M: T                               
登录/注册后可看大图
        </Person>5 M: A: H+ T5 m! m9 A5 d7 F+ a
$ s( M9 o  ~0 C
                               
登录/注册后可看大图
        <Person ID="2">
2 r+ a, r) t. m  ]0 A
% Q. v9 a* [1 v/ n& B/ e
                               
登录/注册后可看大图
            <name>白晶晶</name>
: x1 e/ r! g  g0 c5 [
1 g+ n! o& q( D6 Q* A) q3 P
                               
登录/注册后可看大图
            <age>18</age>
" T7 k: s- E3 X! N! k3 \  w7 z( I
2 h/ L7 _: k& L/ h9 [; I! z6 b
                               
登录/注册后可看大图
        </Person>, U& O; o! d8 g, a

3 o4 w1 R6 e) q7 l# x- _" [, H) c                               
登录/注册后可看大图
    </Persons>4 X# x5 o. r7 C; `+ c

& X9 [. k7 r. Z/ c1 Z" B                               
登录/注册后可看大图
+ o2 R- {* j, Q/ N- i. {  j' t
在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文件:$ o: |! t4 K2 Q3 [* n1 q$ W
; E* q9 h8 T* R: b3 t/ Q
                               
登录/注册后可看大图
<Persons>
( D4 u& ]! W7 I8 E; D5 f

, m9 d3 C7 v' T9 G, l) W- A) G                               
登录/注册后可看大图
    <Person ID="1">  l: I  O  I6 U
8 f0 \  C/ N* H) h% Y
                               
登录/注册后可看大图
        <name>phinecos</name>' p+ i7 ]. _& r) n; s# S
0 x: B6 r! m! ?3 F) D
                               
登录/注册后可看大图
        <age>22</age>
; q- l( M( o0 E- d! ?: k. W

. H& `0 ^( t" j' b% u                               
登录/注册后可看大图
    </Person>! s/ ^. X+ F! b  i# y1 \
0 s$ R" X. v& t$ e
                               
登录/注册后可看大图
</Persons>/ C4 c/ ]  c) a" _3 x. O

1 R2 }5 a7 J4 U3 A) ^- N                               
登录/注册后可看大图
$ R' B- i! j$ g( B' z* {' A
读写XML文件的程序代码:- n; ?5 d( A1 H) r+ @
! Y, R( U! V, G! @
                               
登录/注册后可看大图
#include <iostream>
+ |/ f, p/ w. T# \  z. z

6 a* [' |% m* p- [" N                               
登录/注册后可看大图
#include "tinyxml.h"' o" `- d0 e9 J  o9 ~. O8 \

* ~2 [4 I0 B, z+ H$ S9 R                               
登录/注册后可看大图
#include "tinystr.h"+ }! P8 ?; s0 \% d
  b. P$ A4 [: Q3 V
                               
登录/注册后可看大图
#include <string>! c+ L7 m0 O" w9 J# t/ K0 C3 M
# N3 [1 e* W. M8 N8 \) {% ~" w5 w
                               
登录/注册后可看大图
#include <windows.h>. t3 P  y9 J( m1 P5 T- `7 Y

" D" k+ [  _1 i; b, U& j4 s                               
登录/注册后可看大图
#include <atlstr.h>
' ^1 L2 @, N; F4 m3 i) x
/ u% z" F. F8 c0 v4 e" A
                               
登录/注册后可看大图
using namespace std;
4 y& ?& M" O9 y

: A+ r: g& \# U( F, d6 t1 K+ _                               
登录/注册后可看大图

9 d9 P% @( i$ U4 M" s
' _' c+ ]4 M8 ^' Z( u- J
                               
登录/注册后可看大图
CString GetAppPath(): h5 B  x5 b- v- }4 y
1 z( l6 R5 }9 d; X: y
                               
登录/注册后可看大图
{//获取应用程序根目录
# _! E2 }# n  u- ^+ Q

4 S3 d5 ?( B3 H) _+ J4 t1 @! H                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
8 m$ m1 c* [$ R' z

: L" D: t5 u$ a0 w                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
9 j9 |1 @: R7 e8 F
3 G8 |7 F6 s) g3 x, i
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
7 o; t3 ^6 g. F6 i" p/ y- L" ~
1 |% y5 A& l% I
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));, V0 v, s& s. y* p9 Z, f

1 Y( z1 I8 K; r; X; _                               
登录/注册后可看大图
    return strModulePath;; w4 Y* ~& O9 G: z" T
4 y$ p- ]% `' ]1 n, `2 g  ]: x
                               
登录/注册后可看大图
}
" G* Q9 w) s# R  y
& n  Z# ~( G* g8 S# e2 i2 q
                               
登录/注册后可看大图
+ C* P' Z$ l; [( _

9 V5 k1 ~. b$ q% X                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName). B# T6 H* \8 Z  T2 H
" ^3 h5 k2 w; u% u
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false3 H; R. m9 F+ K! A" q3 v% _; ]1 m

: w* _: M: A) S( I$ C4 ?+ N" T: `                               
登录/注册后可看大图
    try
6 E, D, G- w7 U9 m
6 |6 E7 U4 o% u7 s! t
                               
登录/注册后可看大图
    {
0 }' n7 x# o8 A7 Y/ ?( w: j
+ F# _- T8 v( F; k" ?: L
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
3 ?% R8 q0 g+ F, ^. ^
/ o$ e7 X, g% _8 R* c- `
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();( @9 R! r7 q( _/ G  R

* h  ]5 v; K9 {                               
登录/注册后可看大图
        //创建一个根元素并连接。
# k$ i/ g; U# I. q

4 {6 l& E% }; Y# X                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");4 c0 J: N/ D- ?0 B$ {  c
! r  O- G) E% y3 O5 t
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
0 T4 Y, H; m2 D) s0 q
3 F5 X( r* t* e, h+ R" N" B9 o
                               
登录/注册后可看大图
        //创建一个Person元素并连接。4 L) o8 k. o$ S$ l

: s( E5 C; b8 B' Z                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
" n+ M: @! l7 l  G  O
/ B6 j9 S9 _. X. K2 Z- ?6 u3 X
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);/ L) m* X% e; x; }
  a3 a: C+ p+ G1 D+ J7 G( ?5 L
                               
登录/注册后可看大图
        //设置Person元素的属性。6 z# ^6 r7 p. Q6 q8 ?. B+ i+ M
, L9 O$ i  N, w# @: v# \, a. T$ P
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
6 T* }- L( X4 d7 e* w% w  n
) J: p/ e1 y' x! `+ B# u
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。, l$ _* K: @7 X( f: G! R# [

  f, h$ Q4 }, Z5 j/ e: d                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");- M0 H% H7 s) i# [

9 a% i1 |( J/ n- T                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");  r  f- [6 M/ c7 J
9 C; c2 H8 [5 q
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);, F2 ~3 M& a5 N" C) G0 ~- m  C8 q

. T9 g: k# t8 @( J) M                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);8 _$ }! `9 B0 z' e4 Q6 {5 I$ G, k, c% S
3 m& T/ }2 w. n: L2 s4 _/ \
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
% }1 W1 D. I! I( I% @

7 h" ^% Y8 H: V" A                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
6 \9 V* C, N0 T3 d+ _/ y

- h7 y+ G" A! F                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
2 N, c" ]  |, A  @) b2 g+ |: D
6 u+ p- H6 v. T2 d
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
; X4 V$ B' v4 k+ L+ t
  {2 \& |) A; e! c; D
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
2 o2 i- }0 a1 X$ o

# a' ?0 l- F: r. a% T4 y# v! ~0 b* X                               
登录/注册后可看大图
        CString appPath = GetAppPath();) b7 m  g) e5 q7 j0 F
; y! y2 ?8 ^$ ^$ w1 m
                               
登录/注册后可看大图
        string seperator = "\\";
  X: t, T: x4 A' |% J" h6 j
9 B. W0 p  O& x; G
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;; U9 \: E4 n1 g5 S% a
7 z' \% l  g- z/ J: F
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件5 K' |5 [2 |: k/ K. f2 q
9 ?8 N. e$ N) ^% X# \5 }) v: y8 T
                               
登录/注册后可看大图
    }
- c6 f! v& H: [1 r

% z5 c' x' O  b4 A                               
登录/注册后可看大图
    catch (string& e)+ X, e! o. y2 J

( |; _+ z5 Y( y8 m# h                               
登录/注册后可看大图
    {4 c5 k! e/ |. ~8 {2 Y% e+ x+ ?& n; y
  l% q8 r5 E6 E
                               
登录/注册后可看大图
        return false;% b# z4 D  r& k& M1 [* \* z! Y0 |

+ U2 L# j$ G! T( \+ E" `                               
登录/注册后可看大图
    }; I7 j! D* A: C( M

* @5 H  p4 K( ?4 A* v                               
登录/注册后可看大图
    return true;: [# X% _( X! x
  @$ A5 z- P' e/ j" k/ R5 D$ {
                               
登录/注册后可看大图
}; M3 \3 P4 l9 t, ^

  q/ X2 [. V- ~                               
登录/注册后可看大图
7 ?; ^! M3 \% E3 {
' a8 Y+ D: g4 d6 w# X0 ?, J
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)0 Z0 s. K9 p1 j/ f, b
; p( ^: U* e" D+ j
                               
登录/注册后可看大图
{//读取Xml文件,并遍历2 Q' L# [2 V5 W2 s
7 G! R* H7 j  B( o' H0 V  R. m
                               
登录/注册后可看大图
    try5 D% b) _% H0 w/ ~
4 Z$ R- n5 d3 t* D" ]
                               
登录/注册后可看大图
    {3 R) F3 g+ n- m! x) U* R

+ p, t6 i% g7 g6 T) ?+ [                               
登录/注册后可看大图
        CString appPath = GetAppPath();
- D( L7 [) B- N( k

* x& C& @" m; p                               
登录/注册后可看大图
        string seperator = "\\";, Q/ Q* J- N% O& p% p& |

/ I, v3 i  m' ~  I+ w                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;9 i: p+ e7 c* f2 y8 Q7 K/ u& j

; a- U7 o5 a/ l  C! N; L' A; W                               
登录/注册后可看大图
        //创建一个XML的文档对象。
% F( ^& `! e" @- H! J8 \

2 j1 E' A: G& M7 }5 B                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());1 V4 |8 i5 O! Y9 O6 f+ o
0 ]4 |* G* P+ T$ n+ B! p
                               
登录/注册后可看大图
        myDocument->LoadFile();1 a  ~8 j6 m# c$ m; O0 D
: E0 V3 I6 n6 q% K" ]$ a; g
                               
登录/注册后可看大图
        //获得根元素,即Persons。
( V, r2 g3 _" M2 L9 v0 T: b% y6 @& {

  Z: \: u2 ]. D$ s! ^+ H                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
2 l* p4 a( p! ^& C1 N
" [3 F8 e# |, Z
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。  y* ]0 W/ Z) e
! _8 z, t: I* u! a
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
( h9 j" r. v+ s" C2 C2 t/ ~# K; N% s' C" |
$ @% p6 `4 h- u) S: x% P
                               
登录/注册后可看大图
        //获得第一个Person节点。3 ^& e6 E, R! C2 a

" u" H6 i( Y' h" T! F& |                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
  K6 Z: g* ?  x: P
5 m& q, t: G- c; z8 I
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
+ }2 H$ {0 x, s! p

! x5 V. L$ ?* k( g/ Z, D9 G& F                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
; C9 H3 J, {8 r; P/ R$ |
, r  N7 I- e: q" @
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
0 m1 [" o, c' l7 u0 z) s: J( J, f
/ Q! Q( C6 G$ @3 X& B! E% ?
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();$ {: y, m1 O$ G6 `
1 E8 u9 D( h: f+ `1 Q: x
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。' ~" Z* O0 O& f  e( V0 |

- h2 _  X. Y$ K9 Q4 T2 q0 S5 a                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;3 G' ?1 b8 i7 V) p) G9 N

6 G/ ~6 p% a8 ?% U4 R                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;% x8 ?& @# ]1 X" I5 J' Z4 _

  g( c" ]; a3 g4 h- n0 p  Q                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
# ~2 ]! R- n. M4 g( b

1 v* g2 y! b. d, |. O# D9 Y, `* r$ M                               
登录/注册后可看大图
    }4 z% d, M$ `$ h5 A
( }( L0 C0 w# p0 g1 v& z) N
                               
登录/注册后可看大图
    catch (string& e)
  c% H* \# @: ^, h7 ?% Y% j
" J! v& S6 ]! {9 J7 b
                               
登录/注册后可看大图
    {- B. Q6 _# z8 ?9 ?, D/ \
$ s7 ^, R4 _. q
                               
登录/注册后可看大图
        return false;
8 @( G  |1 U! z" R' p
/ Z+ G  L; g' f, p8 [
                               
登录/注册后可看大图
    }
$ m- O. i& r2 W$ p: n( a# m; s  K: l2 H

: }" Q4 E0 ?& p4 L) b                               
登录/注册后可看大图
    return true;1 H0 t' R! G; t
9 d% m7 K4 I9 u- \8 V4 t
                               
登录/注册后可看大图
}
" q' c) p# K8 T3 R2 K$ ?

' j2 i7 X9 p- x& |                               
登录/注册后可看大图
int main()2 a. B  R* o% L6 g  B9 _
. F9 C% j. o5 W2 P- |7 e
                               
登录/注册后可看大图
{
( Q1 ?1 g2 o# g% T, e
7 d" ^* Q6 e4 u0 a' p1 h( C: V6 V
                               
登录/注册后可看大图
    string fileName = "info.xml";. h$ {5 ]. r3 @2 Q3 u
% M. h3 ^/ D. J
                               
登录/注册后可看大图
    CreateXmlFile(fileName);8 h# g6 V# C. M( R
1 i: N/ b7 i: n+ \
                               
登录/注册后可看大图
    ReadXmlFile(fileName);9 }' K, G; _7 T) D1 ]

6 D; X5 {4 @  N& n' H: g                               
登录/注册后可看大图
}
! T+ Q' Z0 V" G4 a! ^7 g
3 j. N' |# i, ^
                               
登录/注册后可看大图

8 N& [/ w9 }  J$ }  n0 W
8 n' a& V. G8 F5 t
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
% I( E/ \4 E& z7 G3 C4 L  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二次开发专题模块培训报名开始啦

    我知道了