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

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

[复制链接]

2015-1-29 19:28:56 4454 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片段:
- e# B7 c, _; s" B  A
% h7 d) J5 h) ]( {
                               
登录/注册后可看大图
   <Persons>! B' A; ~% p! X# h, T' q

% _/ h4 S' s6 {3 _# o. [                               
登录/注册后可看大图
        <Person ID="1">
/ U) Y. b/ ?: {

4 K# H9 i9 Q+ M0 v0 {  N1 S7 p  k                               
登录/注册后可看大图
            <name>周星星</name>
" w+ P* r+ k7 s% C2 y

  H: C, w; W% x1 G  F) k                               
登录/注册后可看大图
            <age>20</age>
& P7 E8 h6 b6 G; Z0 i) f

) p5 ^$ r& s* C8 h! a6 w' Q' w                               
登录/注册后可看大图
        </Person>
7 C! f  ]8 l( X/ d+ D. d

! l, N& r0 c8 y9 `! r2 C* }6 r                               
登录/注册后可看大图
        <Person ID="2">+ i6 {( \! K# Y: J

! Y$ G/ q2 a4 H) N( r$ |. W                               
登录/注册后可看大图
            <name>白晶晶</name>! N* P( f1 n1 f; h$ M: H
. p# |, m" [; h9 {" F. a* a
                               
登录/注册后可看大图
            <age>18</age>
% a* C% ^" J4 w3 U' }( \1 i* Z
" A+ B- K6 O7 U+ V5 b7 \( X- q, Q
                               
登录/注册后可看大图
        </Person>$ |0 W' L$ i, [. o
2 F) l: s! U4 H) _/ X  z
                               
登录/注册后可看大图
    </Persons>
6 [7 ]3 o1 v6 [& Y1 j1 Z; a
& _5 z) `# E. `- @5 s& |: x
                               
登录/注册后可看大图
& D6 @" q7 N- _: d+ V8 O, s2 e/ w
在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文件:- V: m9 z* B) k: E9 V
; o% J% ?6 B+ y. O" I1 Q# M0 d
                               
登录/注册后可看大图
<Persons>
! n0 }% M8 X) f% h
2 o! q3 s) ~" N" S( Y: c
                               
登录/注册后可看大图
    <Person ID="1">( b0 p6 j! @. j6 k4 ?, }1 }7 a
% W* G1 `& ]( A# e
                               
登录/注册后可看大图
        <name>phinecos</name>
9 {. M# t: d* t6 R# R0 M" I

/ x  V' f) B; ~( }+ `                               
登录/注册后可看大图
        <age>22</age>0 E! A* {0 y! p) d4 o- T

+ t  `( g% U1 F' y8 }6 p/ L                               
登录/注册后可看大图
    </Person>. M6 u2 |! ^5 Y1 e4 t' _
" x# o/ M' `0 A- m% J0 B
                               
登录/注册后可看大图
</Persons>
* M6 X  X' l# I4 }! i  ~' \
! o# T( a' w( D
                               
登录/注册后可看大图
7 I: Q; Y+ I" d/ K, G* ~
读写XML文件的程序代码:
/ D8 `7 i: m' }& w4 ~5 s1 y$ w0 E

1 A# W8 c# @4 V1 Q                               
登录/注册后可看大图
#include <iostream>
. \1 V- S/ F6 I( S
1 o* G# ~8 I. s  G$ j" D: f
                               
登录/注册后可看大图
#include "tinyxml.h"! l; `$ L' A/ i4 B9 V+ l
$ r3 d6 T0 A0 ]5 J" S
                               
登录/注册后可看大图
#include "tinystr.h"" s: k4 `3 K6 B9 `# t
/ a0 \6 i4 d+ E
                               
登录/注册后可看大图
#include <string>- O# _; d- a; C5 e) i2 x0 j

$ q/ c1 S/ C$ ]  A7 c                               
登录/注册后可看大图
#include <windows.h>; K+ r; U: T( W) ?) z

# B2 T% X( E4 w* u4 b9 r- C( G' J* A- Q                               
登录/注册后可看大图
#include <atlstr.h>
) B$ l# k9 ]1 D( m6 A) L  n$ o

. k& y6 E1 M0 D0 t  S: I                               
登录/注册后可看大图
using namespace std;
2 y( n3 g  P0 O* z+ [

7 P3 H! f4 f$ O# j7 g                               
登录/注册后可看大图
. d. p* L! t2 \2 r, |" H6 C

' B& [% e9 d6 Z& P! d- j! H                               
登录/注册后可看大图
CString GetAppPath()
# y+ v' N( v# P+ x7 @' g% t

- @8 k2 t3 \" }1 k7 O2 [                               
登录/注册后可看大图
{//获取应用程序根目录
1 N. ?; ?, V, Q/ s( c& l1 V
3 Q" @: }. i8 Q1 l4 V) t: x
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
  I3 A% p' K4 X  }

) C! e  G5 J( J' V                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);! W! `) }' e: ^- c& b

) W, O6 E: q7 B; T* \: X7 M, @% I                               
登录/注册后可看大图
    CString strModulePath(modulePath);
' c0 o& O& t, O8 c

- O& U) d$ o5 |: k; l4 O                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
. s! q4 ?  V4 ]; v

* ~4 F  V* m  w  N3 A                               
登录/注册后可看大图
    return strModulePath;# O  n6 P3 b  e# {, F; r: S

, G! J: M- T/ V- `) b3 ^. W$ ?                               
登录/注册后可看大图
}
6 S" I+ x! @0 W

' L: A/ w3 O4 a/ \- U                               
登录/注册后可看大图

% e) E+ O  T+ }( M5 M; r, H9 ?

* b; t/ ]5 }  c( g8 x7 L7 }                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)  c+ @5 ^2 C9 e4 g5 E6 D: ?

9 |$ u. z. H* A9 \/ _  h                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
; R: z9 @2 ?; X8 \) |) I* I3 ^
8 W, i* I# i& Y% e
                               
登录/注册后可看大图
    try
( I' S5 d3 R) f: q+ \

* k" K) T% o6 Q& D4 `6 U# b                               
登录/注册后可看大图
    {
6 `2 H8 c4 e2 [1 ]

7 ^2 A7 x* E3 @4 s$ \7 Q                               
登录/注册后可看大图
        //创建一个XML的文档对象。
) _1 Y! t+ {6 b1 f7 O, u- Q- J

+ G. m- J  p/ ~                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();  R% V9 E6 X" \8 P" n- C
% T5 h8 \3 H1 v& w
                               
登录/注册后可看大图
        //创建一个根元素并连接。7 v9 F; H+ d# G9 n" T9 t& A8 r

* Y' H; p( l5 M9 R, l                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
% i) e; {& j: X
) @" {+ ~1 H. o- D7 j6 M& l& k4 W4 w0 `
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
9 H7 x( n  u0 g, Z7 E

, R) {" l6 G# m, b" j                               
登录/注册后可看大图
        //创建一个Person元素并连接。# a- X7 B' p! \$ o+ d# Y

9 k, m1 f. l0 O- ?: D                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
% `2 h) S+ [6 ^" w- V$ ~! D+ v

; [! Y& B- h; v! e                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
5 s1 v2 P. g( b2 e: H- _3 |6 ~

+ i: L* d8 E* i5 H                               
登录/注册后可看大图
        //设置Person元素的属性。
: c  `9 n  E( @9 r: v* Y' u
2 @/ K$ k& k* a! e6 h  Z3 r
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
' B# i  `  F0 _# z: }! j
6 Q4 K& ]' ~) p6 D4 J& P
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。% ^# `  ]! i6 d1 ^

3 z/ _$ {# K" F  U0 O                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");, y) }7 T0 ~8 I! L. \/ v
# ^0 [# l  {) M$ u; s2 D
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");; {8 W- E: a: }* X7 m

9 S1 C4 `# L( g# l4 d6 _                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);: T$ D3 q+ f4 [/ `2 ?' q7 F2 c
: a& F' `+ e. Y, ?- H/ Z  E9 b$ `
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
' L9 V5 v' q* k
4 i8 t# e  G- j* O3 W
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。, K2 N( A: |4 R& F
5 ]6 S3 c: u$ c7 D- L; V$ L5 z
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");+ {. m* n  }- \. @0 g
& l1 X4 D1 @$ T/ V3 M
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
0 J' d2 U3 i( Q$ g
% c) N/ k0 |( F' }
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
$ Z5 l, Z' Z( I; @3 a" P: v! d
+ a* ~" ~- Q/ Z3 L. I
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
+ p4 D5 F3 G, a! J9 v, \
0 s3 D! _/ h7 W) h4 Y9 C
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
  |: N- I/ \7 x, G8 J7 b
+ l# W. m+ n6 l
                               
登录/注册后可看大图
        string seperator = "\\";
: q4 M; O! x+ D& ?' n
* K: [( Z$ j3 i% j% A$ V- z
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;5 J" W- ?* g; _# E" k+ p. i$ G
* i5 |8 c! F+ g6 {4 G2 `* I
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
2 [: @- R8 Q( W% c2 r( ~

- p, [! u+ e# ^: P5 p                               
登录/注册后可看大图
    }0 L4 c! Z0 g! W7 j7 ~/ G3 T5 M

: l% M9 w5 d& v                               
登录/注册后可看大图
    catch (string& e)/ u! X1 x$ t  M. ]7 @" K

/ k! I! B& ^: h" q* s- c* B                               
登录/注册后可看大图
    {/ O: u# C8 t9 c) r: \
  }7 L: g3 l) u2 G7 u  }# ~+ C
                               
登录/注册后可看大图
        return false;
, Z$ G( D: Z- |/ \3 c/ g
- F8 ~9 ?$ h! h3 t' m1 J! K
                               
登录/注册后可看大图
    }
) ?3 A1 P4 }; P/ e7 x1 m# \

8 M" R" c# K% M0 Y, t                               
登录/注册后可看大图
    return true;
% q2 E) o' `8 F
3 A: f& }0 t( {3 G
                               
登录/注册后可看大图
}
0 s$ {4 |! i4 M( S' j- B" ]

! f. \5 r$ w/ r0 @9 o                               
登录/注册后可看大图

/ U5 n! ~; o; v# |# l

& |0 O$ z* b. e6 w1 V  [- M' `                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)5 K3 d) ?( s7 W! \/ m+ h
0 r7 s7 S& ?8 ~" b1 O3 c2 w
                               
登录/注册后可看大图
{//读取Xml文件,并遍历- q8 b" z; ^: n& u
' S3 n: V( I5 a$ G& X1 `' h
                               
登录/注册后可看大图
    try2 R$ o) N' i6 c$ T" h6 U

5 F4 K9 E! y8 f- y: z  h                               
登录/注册后可看大图
    {
) L3 T4 d% u: w9 @

) `1 R3 n7 k  h+ q                               
登录/注册后可看大图
        CString appPath = GetAppPath();$ y& J: _0 _: i5 H8 q3 v; k2 s9 {
6 t. Q  C0 M$ f- ]8 `
                               
登录/注册后可看大图
        string seperator = "\\";
2 H" u$ p9 N6 B  t: q
1 a) m% J# U* S
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;& u5 x2 z& V8 d. J
: F# F2 m* S6 a1 O! J& ~
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
) ?# `$ l9 \4 i1 L+ p
/ J3 G. }0 ?( I% F- F6 Q
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());* K3 k* I6 D! y9 j( I* v1 i
6 K* I2 U- g4 o9 x$ b
                               
登录/注册后可看大图
        myDocument->LoadFile();- V: d$ r: u* O* d  u% k6 d
5 v" u. ?( v# @. i5 i8 ~3 P
                               
登录/注册后可看大图
        //获得根元素,即Persons。
$ z  J. k. R, C1 D8 O8 I  K! @
& O" X& y3 B- }8 H+ o7 e6 W: ^
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
2 e; Z- Q: B( T) y& k4 H/ {

/ R8 V+ n$ v  h: j                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。. N0 |/ A9 u$ H; C) u! e
- F1 o% w- C2 ~, u2 }# }  ?
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
9 }/ J+ X: P* l& g$ j

# U' K/ _6 ]  Q( o" s" s7 s) _1 Q- ~1 Q                               
登录/注册后可看大图
        //获得第一个Person节点。0 X7 N) d0 m: G4 F

  r2 L  P; L# A( r/ _                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();0 l5 t  V# H8 \: {
, f: h' f9 g4 Y! @  t
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。0 ~, a2 |# Z/ w1 u" H% o

1 Z# g9 ?2 b) O                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();4 s& G$ J# S* h3 {8 @6 O- j

  q& Y! O% J2 f  P; C# [% X                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
( Y) }# f5 [* e. C! A

% X. K, z' }) O, f- O4 U                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
' d; M& n: e% q+ X) r
5 r0 B( n7 u7 _! q. f+ b
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。0 E0 F& s7 k+ H# ], e' k

- ?7 e$ u8 @) E3 N                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
+ K% i; h4 z* l$ o' ~3 ~, E
/ p: ?% j+ r9 W
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;6 v8 R4 J* ^3 J( c. f, I% t
0 ~; R, @: r8 k
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
# I: k0 K3 d; {2 A3 e& W- s' v4 E+ y

/ V4 W3 t9 M/ ^. t$ g% c& @% I                               
登录/注册后可看大图
    }5 r8 V/ @9 l, _6 X! d/ J; P" M

) U% D1 C& X- t4 Z  a3 H9 C! x' V- S                               
登录/注册后可看大图
    catch (string& e)( s4 }0 \" z  C8 f9 @* \, e2 I

- Z. r( R/ q: E, V9 C# r: f; `3 b                               
登录/注册后可看大图
    {9 I: l% e5 E9 `' o/ Y. t" k

4 [( T- D4 y$ L; d! ~" L5 J                               
登录/注册后可看大图
        return false;
8 W2 h2 V& e, F
8 y2 B) C4 C* d
                               
登录/注册后可看大图
    }
6 p4 Y) n. K  `0 f1 W" L, G

: q6 D0 I  ]. j: |, M                               
登录/注册后可看大图
    return true;) O: ?$ j' f% g( {5 D

( N5 u5 |- `3 U- H, |                               
登录/注册后可看大图
}
. U- y) w; M% M% D/ v; I

# Q7 I, S( [7 S6 @                               
登录/注册后可看大图
int main()
# Z( |8 Z' |2 a# ~' ^

. @+ z  V3 ~6 g: ~! `8 p  N                               
登录/注册后可看大图
{/ n# b6 v! H6 X8 ~- w' u

8 M8 n" w0 Z, a9 K                               
登录/注册后可看大图
    string fileName = "info.xml";
$ H0 B1 M7 y& J
1 W1 [" P) z5 y! P* n8 A
                               
登录/注册后可看大图
    CreateXmlFile(fileName);0 B& ~; o/ d3 q: o  C

# y& q* @* H5 Y% {8 r. Y( s                               
登录/注册后可看大图
    ReadXmlFile(fileName);7 B& C7 g2 t3 _3 e6 P1 ^6 o. D
0 j5 T; T! V2 T+ V( @
                               
登录/注册后可看大图
}/ J7 l+ Q- E$ O" N* |
$ x* e6 ^  m% y
                               
登录/注册后可看大图

: J8 O8 A* Q' L$ b
2 B' T+ k$ h& m) f: m
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  8 U( ^/ g6 U5 \$ c4 q
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了