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

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

[复制链接]

2015-1-29 19:28:56 4539 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片段:" l* ?: b' O1 d7 m1 b8 Z+ k* y
/ H8 O4 [. Q" G6 @( R
                               
登录/注册后可看大图
   <Persons>6 c" \3 \% v, S# |( Z9 a
0 X7 `) [+ j; U
                               
登录/注册后可看大图
        <Person ID="1">
6 s% X4 x4 U+ d4 u2 {' _4 _7 N

1 t* ~# u/ O, k& j8 ?9 \                               
登录/注册后可看大图
            <name>周星星</name>
# \' Z7 S+ i1 @; w, z: @

) [* O! D5 T0 Q; l                               
登录/注册后可看大图
            <age>20</age>
4 i9 n$ y" T2 X' c
9 Q/ B, |% Y# s0 O
                               
登录/注册后可看大图
        </Person>7 H0 _1 _+ X1 o" t- I* `

! A0 H7 t) _* O6 f7 ]( w) M5 u                               
登录/注册后可看大图
        <Person ID="2">6 d* H1 Z+ F3 |7 m2 O/ a7 ~8 K
2 X+ o0 ]# K4 _% c9 K$ ?$ F. |
                               
登录/注册后可看大图
            <name>白晶晶</name>8 h4 }( \7 @# R! p9 A1 `" u% G

9 ?5 s7 m( L  A, A( ]5 j                               
登录/注册后可看大图
            <age>18</age>( o7 n4 }, o( g+ R0 x. U; z
& q2 D  G6 f! \/ q* s6 k
                               
登录/注册后可看大图
        </Person>
. S+ N2 S! X- m- A! [

5 ?& {: N, ]2 g4 W                               
登录/注册后可看大图
    </Persons>
( d( R5 m: X8 P+ `+ Z

  \/ L* X% t2 H                               
登录/注册后可看大图

* S# M% w" e" f% d
在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 R- o0 \" R4 R
' J# g& I8 R; u
                               
登录/注册后可看大图
<Persons>8 ~1 ~, @7 l3 B! G

, D7 {! N, Y, S' j6 U1 _' W1 \) @                               
登录/注册后可看大图
    <Person ID="1">* M" n5 }, m& y8 E  i

6 h8 i2 B" b* Q2 F* h                               
登录/注册后可看大图
        <name>phinecos</name>
5 K: B1 q' N1 c! |
6 G" v$ K5 u+ q7 s
                               
登录/注册后可看大图
        <age>22</age>! s6 s+ @, [9 u1 E
( }/ Y- S3 _9 ~
                               
登录/注册后可看大图
    </Person>
9 u0 n- ?6 u* K1 Z* `' v8 |2 Z' i7 o

% q' [! Q0 U6 g( L                               
登录/注册后可看大图
</Persons>( X6 ^3 D4 H* [: R1 m& I7 n8 w

9 @9 A0 z+ Z/ L$ y* \. x! @                               
登录/注册后可看大图
7 @2 N2 e3 }5 c7 d6 y  H/ L0 v
读写XML文件的程序代码:9 g; e  E- d5 d  O
) [# Q. F9 c; c. K6 p
                               
登录/注册后可看大图
#include <iostream>! C3 L. F% b& v9 D6 }/ ?" K

  w, ^+ Q, [/ t; `                               
登录/注册后可看大图
#include "tinyxml.h"6 h: w$ m* C, D1 B0 [% h  m
; q+ m! d3 ]6 i
                               
登录/注册后可看大图
#include "tinystr.h"+ w& Q; {4 u( r/ j  D
* X, W: B( {& l
                               
登录/注册后可看大图
#include <string>
8 C6 Q: J% }2 X! l# u
8 {4 i6 r0 s+ d# S0 `
                               
登录/注册后可看大图
#include <windows.h>% h$ u& G: M0 g1 Y' r5 x( C

- F/ h2 \0 J4 R6 R3 B                               
登录/注册后可看大图
#include <atlstr.h>+ S  `( ?! o2 T# H6 a2 ]2 y$ a
$ c7 ]1 f' E8 l
                               
登录/注册后可看大图
using namespace std;) _* v; U% n3 v) x1 s
; t- K6 M& S* N
                               
登录/注册后可看大图

( G& Z( g' _2 M  ?5 f$ b8 s: Q
- _; r. C; s' C/ Y
                               
登录/注册后可看大图
CString GetAppPath()
$ X1 x" v& y* K( [" E0 C5 P

2 ?' q9 j7 K/ i4 V! b# T                               
登录/注册后可看大图
{//获取应用程序根目录
1 l. a0 h) t" H% V3 F

8 i; G1 O' K9 ?5 J( k6 ]; H( r                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
: c- _) `. G. F( t8 V

8 h, M6 U: w9 Q0 X" k! X                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);9 a1 }& C5 I7 ~5 K) {

  Q! Q- M3 y  p: G( z                               
登录/注册后可看大图
    CString strModulePath(modulePath);
: N# m6 i/ t- B9 M, o) N
9 C' Y. W; Z  D$ t5 N' h, J
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
3 u' k4 |1 \1 N, c/ u

6 V7 M7 |( n7 B: B6 R                               
登录/注册后可看大图
    return strModulePath;
* Q$ [8 t, d6 j4 T, b# S

) V3 }1 c' e/ U% ~  `  Z                               
登录/注册后可看大图
}
* o5 P; U6 @6 f5 R  O0 a2 n! L

4 M* y; Q7 h$ x4 B, `% H1 Z3 U                               
登录/注册后可看大图
4 b7 E+ a! c3 Q
: e9 c) T; |0 g' j
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)6 c5 n( y# L7 `0 {/ c$ ^

2 p" H7 ^! T: L# J& t                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
0 P/ d. _& f2 ?+ V% O; t

" @4 |$ Q8 X$ g2 f6 f                               
登录/注册后可看大图
    try5 g& L. g& D5 ~- S# t* g

2 _% g$ @0 J- K4 I) {                               
登录/注册后可看大图
    {! x4 W: c7 G1 G4 N6 w7 k( j2 ]
! L2 J' k) o2 f5 q2 W* u0 t
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
4 R  E; H9 D4 j# @

$ ~- [4 ?( S4 [2 U6 n& M                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();/ e1 o/ v& t5 {. v+ |9 k$ H0 `* J  t
# i3 |" K5 v  d3 B: C4 G
                               
登录/注册后可看大图
        //创建一个根元素并连接。
4 n% s5 |5 Y1 b+ s! l  U
3 D& p  ]2 [$ Y; K+ K1 I
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
& P. \$ q8 P# C& Z8 e

, X  w0 G. E. Y, v                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);. y$ E% I, r) @

; B$ f9 i* f- C' X% j                               
登录/注册后可看大图
        //创建一个Person元素并连接。0 G* M6 a! z9 m. J

/ i* s6 {7 n$ G                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
4 z2 B) {* j' A

3 K! H- r1 s" y6 k                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
( G) }9 \8 u3 {5 N8 A! f+ m
. n2 k* |8 M* L" w7 O  E9 X# u
                               
登录/注册后可看大图
        //设置Person元素的属性。
+ e' E) N4 P  W5 _+ z. t. u- A
- g8 X7 D. G0 p' K+ Z" o# I7 b( Z
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");) W3 j, |: l2 K( R. j

' ?- C) i/ d1 C6 A4 C- T                               
登录/注册后可看大图
        //创建name元素、age元素并连接。& ^2 V9 @3 ^$ p/ C/ U  ~9 D1 J

2 t1 B' m/ ~  [- w                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
! Q& W1 H3 S% j! _6 r2 S! \
. Q( \; N9 N- ~+ s5 g# n+ y5 d
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");7 g: D3 [; \) c- l

$ t. e& F# U' p( ^& G8 M                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
# p0 x7 z. W" W" t- @! ~1 w$ D" o# S
- j8 E! I! C) D0 l( V' s. R& i
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
. a% V0 a6 z1 w5 U
: {+ v% H1 Y( D4 u
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。4 a: @" ~5 A1 o6 J8 T

" V6 ?  q* K) F$ T2 @( |0 @                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");* a4 I+ L0 U3 V  R
- I& ^& t3 B$ G& q
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
% L0 P9 t9 r7 A
; S" e9 U: a2 w3 W) `
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
: R6 y. L6 f5 N

. ]1 l' T$ X, B4 w5 n& G- a4 T                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
0 B( S# S, s& v) Z2 S  A1 ]
- o" g' _. ?2 |/ z
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
$ B# B2 A8 i6 ~9 g! ^7 @$ E8 d
' X7 k. F( N6 @; l9 J
                               
登录/注册后可看大图
        string seperator = "\\";
+ ]5 [/ m7 R) C$ B' f
' y6 v, ?* v4 ?  Q
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
/ e% [: x! J* }# i9 {. I) h

7 H: i% k, f& ~; g/ j8 g# Y                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件: j- p4 `$ M2 v& r7 Z$ N

0 E; |% d$ l6 s# b- j/ g6 w; [( }3 c& c                               
登录/注册后可看大图
    }
; J4 A: O+ x1 p6 Q' P/ `

( T" a! O) ^9 M5 W" C- _+ Y5 _                               
登录/注册后可看大图
    catch (string& e)8 h) \6 K( N. [3 S" t- n8 n

- p- j& n# n3 f3 R3 F+ }" N& L                               
登录/注册后可看大图
    {
( h! c9 v! [* p) t! ~

7 R6 i& Q7 @, T+ H' r8 s& {+ Y                               
登录/注册后可看大图
        return false;% K" k* l$ `% Q$ [/ r/ b

$ w1 d( t: k' k$ N4 t- q                               
登录/注册后可看大图
    }( v( `0 L. ]' O3 }( N
$ o& w. B( |* m8 m  i, g; d
                               
登录/注册后可看大图
    return true;
) T8 p, e' o9 t. ]) o+ O# t- M
( l' G/ s$ U# u- Y
                               
登录/注册后可看大图
}
' f6 Y1 ^: d0 p+ @' z

3 x% T8 y7 }  ~7 p  p8 Y                               
登录/注册后可看大图
! Z% y4 o. ~1 ?$ U( f
: {6 S) s8 I) }/ U0 P1 u
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)  _3 `4 F  l" ^7 `" r* H

. S7 v" h+ Q6 Z( @$ h6 Q                               
登录/注册后可看大图
{//读取Xml文件,并遍历7 A& Y* T0 r* p# ?9 h7 r0 A

+ ]; A+ h3 P* w                               
登录/注册后可看大图
    try
; b9 c1 E$ B9 J% j  B6 x1 }! P. ^
$ A* m/ u0 v4 K) ]8 e  A6 g; D
                               
登录/注册后可看大图
    {
4 J& ]( P& s8 H2 q$ Q2 N- S

+ d$ a  M! I' R' ?$ z2 M                               
登录/注册后可看大图
        CString appPath = GetAppPath();' C5 D" a: D- ~' M9 E
/ }% }# F# U+ S7 b- r% D* u; E& x' {
                               
登录/注册后可看大图
        string seperator = "\\";
  b* c+ ?) @0 q" u+ H

  |  K9 I! B5 a1 B+ i: T                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;0 q4 |6 Q9 J+ @0 J2 R5 M2 d9 R
) A  V" w& Y" g: x( U+ e% N
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
8 k. i( T1 ?8 u2 {/ P) j
. T* s$ b. \8 h6 G, I1 e- C
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());( m& J# p) O9 L( _

3 M$ T: b+ n0 E) R. G/ ]                               
登录/注册后可看大图
        myDocument->LoadFile();6 v* `" |! ~4 J, X7 F

  _1 Z. a7 p- k5 v. f6 V                               
登录/注册后可看大图
        //获得根元素,即Persons。
# ~1 k/ w8 M4 v7 c; p( I6 o
& ~# S8 D1 ?2 E1 ~0 D
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();8 P) s& S# @$ S7 D5 \
7 i6 F1 D2 Q# M8 F! C. H8 m
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
% b" D( R7 _1 X( x9 ?
: O0 l5 s3 l' d/ Q$ Y9 }* O
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
' l  _! r3 p# |8 z/ f2 R
# [' h7 n- ]& o7 R% Z
                               
登录/注册后可看大图
        //获得第一个Person节点。: O& K- U5 t0 n6 v  {
* m$ F3 S: b. [4 n  l
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
( u) T5 T1 a/ @6 O  _. a/ `

7 _# Y0 U( I$ q                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
5 l, |) O( E  C7 a  U- K/ R+ J4 d$ j
# c# r0 u0 q  }& N" ]7 D
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
6 _  q8 R5 M' k0 j5 G# q
& r- K0 c8 u8 q* o0 \7 H: F
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
( {  h( y' Y, d4 p1 N

. S# r! ^7 c$ z  X3 v                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
: I' ?- {8 k0 I

5 v' {! _7 ~5 a" v                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。+ u) J2 z4 e- q, {2 y) N+ z
  M/ Q: U3 e+ R# N: S4 m3 ~
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
9 c6 ?) Q7 W, w
0 d. E9 e$ }1 h& G. X9 n8 _% `
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
1 {3 b; U- J8 I  Y6 {8 ^2 O  V+ |: S. h
0 b- z0 t8 B/ r- z/ T
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
' |5 `" y; ^8 U+ N8 c7 G
! |% d4 q& H' G$ v/ {- N
                               
登录/注册后可看大图
    }' d$ U) L0 F$ Y/ m
- a8 t' `- D$ U& {# }3 v3 }
                               
登录/注册后可看大图
    catch (string& e)
- U* h# a/ M. Q: ~
. ]7 n: _" W0 w* b6 C$ j' g# D
                               
登录/注册后可看大图
    {. B2 j8 B) i! F' y2 s5 s
/ U2 s2 y1 ?" X6 ^) n7 P: R" d
                               
登录/注册后可看大图
        return false;
% k5 ]+ t0 |# }, d& d
" [# q$ u- P0 v& h" F2 b9 {
                               
登录/注册后可看大图
    }
- n0 d3 ^* C# N- Z
/ j( h/ @* c0 s$ t
                               
登录/注册后可看大图
    return true;. ~. r- o! ?. |* [9 E8 c" Z
, ]# N" T( X% I: h' s
                               
登录/注册后可看大图
}0 w9 L; l1 R2 P/ `1 y; @3 [7 i6 r$ C- a; h

3 ?" i, b2 C- M9 r+ f& G4 T                               
登录/注册后可看大图
int main()7 o" f8 V4 d* q) |
; Z  k: Y7 V4 @* v) J- A* p
                               
登录/注册后可看大图
{9 u7 b' T+ o! B3 d' R+ f

& O; [2 F9 G+ O1 h6 J                               
登录/注册后可看大图
    string fileName = "info.xml";2 s8 N( B8 V! L( n" T& B) ^( u$ u

* j% k# o) U* p$ S- Y+ B                               
登录/注册后可看大图
    CreateXmlFile(fileName);
' g" \3 D' Y) @9 N0 K; Q

3 a1 v% {' q* w: q" j5 q                               
登录/注册后可看大图
    ReadXmlFile(fileName);1 L: b" |9 b+ N( \0 U2 ~, J# @

0 Q3 {6 a' n  Q/ V/ z                               
登录/注册后可看大图
}
- U$ T+ b* @1 i+ ?( i- ?
! [7 V8 P; g3 y/ J/ `
                               
登录/注册后可看大图

: P8 s, @% `# e7 M8 K% R0 y' @4 _1 e. ?& n- Z& b% J+ j+ D
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  % V7 V- {! D6 u: ~  B( F) E6 V+ G2 m
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了