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

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

[复制链接]

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

320

主题

226

回帖

9784

积分

管理员

PLM之家NX|TC专家

积分
9784
发表于 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片段:, U' K) \. l: K, U$ L. d- L0 }
* v5 I5 z" S" z( u6 L% w  A
                               
登录/注册后可看大图
   <Persons>5 ^) |" W) e8 t9 k# r
' y) r5 U3 F2 N# C
                               
登录/注册后可看大图
        <Person ID="1">
& b- |9 y( ]4 Q2 N. e9 z7 i3 I
& F1 U6 o7 a4 I& v# v" @
                               
登录/注册后可看大图
            <name>周星星</name>  M9 G, y2 G% k0 ?4 T, d
- r3 Q( b. |7 n5 R8 z) M8 J
                               
登录/注册后可看大图
            <age>20</age>
9 V/ ~: O# p3 @  F2 f1 G

0 m+ K4 Y; j4 _. Z0 K! n                               
登录/注册后可看大图
        </Person>8 {( F1 v" R; U8 }, _! T; C

- J4 b' [/ D$ l$ _$ \                               
登录/注册后可看大图
        <Person ID="2">/ c0 F" s# Q/ I. N

% }7 F% A7 u( o# t                               
登录/注册后可看大图
            <name>白晶晶</name>2 s; f3 z! W/ K
! X% E* m4 `3 ~# Y  p
                               
登录/注册后可看大图
            <age>18</age>
# k) \0 b) d5 s' y1 H
- r/ X: D# f0 |; d
                               
登录/注册后可看大图
        </Person>
8 l6 Q7 P# O0 r& T' P7 n
  Q! Z! w, c5 p
                               
登录/注册后可看大图
    </Persons>
* o* r3 A  ~$ u8 A

1 ^; k! a9 c$ x! s, V  h* |                               
登录/注册后可看大图
5 P" \" O) B0 |* P7 i" O2 G  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文件:6 {6 j/ G( Z3 V
. @2 Q% [' Y5 m; x8 R8 z; m6 i# v
                               
登录/注册后可看大图
<Persons>
$ t6 |) l3 m$ @! u( y- h

; C2 j, N( y0 g* X; e                               
登录/注册后可看大图
    <Person ID="1">6 S7 d0 C( T; A4 _4 ?0 g# g5 v
/ d) C" q# \7 T( ^$ ?
                               
登录/注册后可看大图
        <name>phinecos</name>' ~- B" J9 |8 M1 Q% m( |" Y
. |: W$ r  g/ @6 D
                               
登录/注册后可看大图
        <age>22</age>
1 E3 C' d; a' a+ t( N( o+ @7 s6 w& t

8 v: m2 K. c% [" G+ j2 _; D                               
登录/注册后可看大图
    </Person>: l6 k4 M9 x1 [- Q

/ h6 C, J$ v- j( d3 R9 |                               
登录/注册后可看大图
</Persons>
6 \+ O& B' e+ e0 N" ~* Z

3 ?8 E3 f, Z/ [* m  l  W! O8 |2 F                               
登录/注册后可看大图
' O, }8 \6 ?$ f* @8 q( g
读写XML文件的程序代码:( _  f- Q# G1 }/ X. e; m0 ?

7 x' @& a- T  X) e! d1 w5 e                               
登录/注册后可看大图
#include <iostream># Y) l2 p. F5 z9 @. p
6 S/ I& {9 }1 q6 u& p7 ~3 O  S
                               
登录/注册后可看大图
#include "tinyxml.h"
# \% s$ ?  j( ~* z: o& |

* [2 a9 V* z# e" P                               
登录/注册后可看大图
#include "tinystr.h"
) h9 \- x2 c% {
/ C0 G& n. p0 m1 g
                               
登录/注册后可看大图
#include <string>2 p! A# v7 {  q

, t) g* r: t8 y1 f- r                               
登录/注册后可看大图
#include <windows.h>
, c2 }1 ~4 m$ F9 r2 {2 T
% x. W2 R9 F- J0 b/ M
                               
登录/注册后可看大图
#include <atlstr.h>
5 _/ P2 ^7 B$ ]& m4 m1 \% G
# `, g& n4 }: T* w3 k
                               
登录/注册后可看大图
using namespace std;. b6 Q- m/ s& T/ I$ V/ T% z
/ _# }: i) U9 \  g% T! \
                               
登录/注册后可看大图
4 G% O* D) h3 Q; w2 E# G3 ]
& j4 u+ T, u1 c7 d! U& |8 L
                               
登录/注册后可看大图
CString GetAppPath()
9 m$ J9 H; e* ^: P
- `8 f9 {9 U8 p  O; p, l
                               
登录/注册后可看大图
{//获取应用程序根目录
: n3 B5 X5 i" a& u( s. n
* q& C- ^7 O1 f. }' c
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
: R# p- e! j4 A/ `
7 O0 }/ f: b7 l+ i. U% b8 H
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);; z: @5 N' ^8 s

  u" D& v/ s' S* q( J                               
登录/注册后可看大图
    CString strModulePath(modulePath);! U! _+ ]7 X0 w3 q) K- |& x
, D7 f0 M, d* [; j" h  Z: {
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));% {) o8 e- H$ p, U3 J
& S4 k9 W4 d; n8 ~
                               
登录/注册后可看大图
    return strModulePath;
, a: R; D( A0 @& e1 a, ^( v
* q/ d3 C  U1 T. |3 k
                               
登录/注册后可看大图
}& }1 y" U2 m" v9 O2 Z

: F( C* ]4 b. w4 b+ J6 \4 L                               
登录/注册后可看大图

0 g' g$ d% L# T3 [" ^9 i. v
% O  U! ^2 ?/ k# [
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
$ Z/ ^- `7 x  l9 `% n3 ~
' e+ m' U  q  X
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false5 e7 X1 e% g; ]; C8 x. D

% b, |" w4 @5 l5 |* o9 v3 m                               
登录/注册后可看大图
    try0 L) y& {, D" a+ E
/ _  D7 v. l3 v9 w# j7 Y
                               
登录/注册后可看大图
    {
. b" q; ]& y4 ?* W4 v: X4 t4 K

+ ~9 g& @5 t+ \# ~                               
登录/注册后可看大图
        //创建一个XML的文档对象。
( V5 _/ r( A; e# L% N/ s* l$ }

$ V) d7 m. W6 M1 {! l. V5 p3 n( m                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();4 r# z) C8 Z! _7 y% \

3 R9 o0 N+ I5 c9 C                               
登录/注册后可看大图
        //创建一个根元素并连接。
2 n/ E+ R  |: O* c( `- ~: {0 a
" t7 E9 e" k+ j
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
( R5 `$ l; E' u/ A3 R/ i9 ?
: _5 f/ I5 ~! ]7 r+ z6 X
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);1 R, I) ~& v1 n. w- Y( b! ?

& A- p& t$ B( T1 H" |; v# c! _                               
登录/注册后可看大图
        //创建一个Person元素并连接。
* B8 o+ n5 i) B) l7 k5 o

! c; v% m' Q* H4 n/ [                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
; A1 j2 @5 F0 Y2 J% I. H- q. j

) ]- ?, I3 F- ?9 V; m1 \5 o7 `$ B                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);2 P% _- M2 V% l) R) ?6 H
% o' ]- y6 J) b2 l/ f
                               
登录/注册后可看大图
        //设置Person元素的属性。  ]. w- j$ Y% }4 }/ X+ _

, ]7 q+ ]  J% m) \                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");0 u+ k# M6 a5 @4 Y
1 d; c% N! _# O/ i8 L# W
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
6 n/ V( O% |) \+ k' p

) V7 W, t/ o7 g0 |( @                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
8 ~' u+ l+ b3 v- s2 k2 E' Z0 ?+ F
" n- G3 y- i: S  u
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");( f7 ~+ J/ \) V2 [+ {
2 [" B' z8 [" q: H/ p% J+ R! b2 ?
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
0 ^6 K& Q6 T9 V% O
$ x$ G8 a. g- |+ g) Q
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
. O  Y( i* W0 u: Z4 i) Q& C
5 A) z. x9 B2 g0 c  }2 r/ @4 t
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
+ e+ t& E# D! l  h! {7 _
% ~' @6 Q6 p' x: \. P
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
9 w( P& N: `/ h
% G. y) T! ]' m" n( P6 Z4 z
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
) b3 E* C5 O8 p6 I- _

9 j5 ?  `" \3 G' a, r                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);/ P  Z  m, j. b0 I

# T0 i# _7 q  b$ _                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);7 g3 a; q8 A# M( t
  Q% X0 `% W4 s4 l6 ]
                               
登录/注册后可看大图
        CString appPath = GetAppPath();( L8 O: }% _5 a& x
% T  Q: L* ^" v0 [3 u. ^4 `
                               
登录/注册后可看大图
        string seperator = "\\";- {; x- z# e: h- v5 d, a! q$ M
- q) Y2 |: ^, J( {
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;' K- j2 o3 Y  H% j

9 y: Y" I1 x# Y: p4 Y8 e' b                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
7 l( I4 z3 W2 C9 \' e0 C8 {

2 U# S8 ?+ h8 S6 t. r6 |                               
登录/注册后可看大图
    }% ~; k5 b  n& y# O

0 F. g# l3 J$ w2 v; ~6 P                               
登录/注册后可看大图
    catch (string& e)3 C. V! w. L$ ]0 ~! M9 n/ x+ z
1 j$ U6 k% K) z8 s; S) h) H6 N
                               
登录/注册后可看大图
    {2 b1 P8 p$ m5 \: F* }; |
' w$ u5 T8 h. n
                               
登录/注册后可看大图
        return false;5 k9 F0 a  V0 X3 {% r  }
! f, q3 a- j8 c9 H
                               
登录/注册后可看大图
    }
8 Q1 K* [6 Z* M/ V

4 l# h) S6 [/ a5 X                               
登录/注册后可看大图
    return true;
0 B  N9 A/ [2 k- x4 a+ |2 t- J# p% o( e
7 Z1 S* a$ p9 d: t; W/ `
                               
登录/注册后可看大图
}
# o8 {" H4 E, K8 |; F" Q

( j  p$ m; H( k; O6 I                               
登录/注册后可看大图

$ y: d- v+ B) D9 }" j
! s8 L7 B( N- u" N& V2 V
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
6 m3 ^6 b: S% A( q
5 ~0 g7 {$ x: @4 r- R
                               
登录/注册后可看大图
{//读取Xml文件,并遍历% _) N9 F) Z" S( [
, [5 ]. ]8 ]$ H- ^  F
                               
登录/注册后可看大图
    try
# _- @" O! l# }7 r0 P% s! i

! r" Q) T6 k3 v: A                               
登录/注册后可看大图
    {" z) B1 h" @4 @# b: r( a. r

' A# I- E- P, b- e' |  V                               
登录/注册后可看大图
        CString appPath = GetAppPath();: z" o* T( r* H( l2 P& R

/ v& U9 _2 T- W* ^/ ]  i: F" X                               
登录/注册后可看大图
        string seperator = "\\";
2 I2 R; ^# W7 F) N6 k
; Y1 T2 G4 ~' s$ E" j
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
" m0 d; T9 f7 |4 O7 |
% j6 ^3 x6 g3 d3 {0 p& }& q
                               
登录/注册后可看大图
        //创建一个XML的文档对象。8 D2 x# W+ P* Y8 T

9 A  m& G8 t3 [1 Q1 @* y                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
: Q4 I# P+ C. j6 f2 ]  j3 D/ S

  C9 e1 O6 C$ J* W0 R                               
登录/注册后可看大图
        myDocument->LoadFile();3 ]& Q$ l- E& x7 Q0 D# s3 b

# \* t$ a( n3 _                               
登录/注册后可看大图
        //获得根元素,即Persons。8 c" q- D+ y6 [# V# E; C) c
: M* n. K# @- a" @
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();4 ^, k& ^) D- @

0 {0 g5 R# n; M" M                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
- j' n% Y6 v* s6 M, r
5 I, R- A5 d) H; K4 m% L3 e6 A. c, |  X
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;( A/ b, I5 D) M" b$ e
* m8 w* i, z6 o# \8 O* E# {
                               
登录/注册后可看大图
        //获得第一个Person节点。
: P7 |) _2 z( Q; w

7 T* o: N; G$ _6 F" M/ b8 s                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
$ ^4 N- Y# X: p/ \' h: J: {
0 Q+ w' A0 Y7 L: z5 A
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。3 n( X! |2 d$ H2 `9 c: M; f

: V7 p3 U4 `" _; n1 Q! p2 m                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();, {" r  m: f+ }0 ]- g8 D) z
' A; K# N2 v! }) Y
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();6 `0 t3 B+ t2 h1 h; ?

; M# F2 ?7 u. C' J, i) g. n                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
& }% C+ z) r1 D9 x% H& h' V7 j
7 r( U5 r" j0 s" N* c8 ]' u( X
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。0 e2 @( @8 q- v1 X
0 v# x7 e' R# `' r7 `
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
5 Q7 G- e6 p, [! B  Z+ d
" \! h$ `3 t# P. f' Y0 L: A( M
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;7 q9 ?. R+ A, g2 g. V

4 k4 |9 d# Q) Q                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
# y/ G8 t' U* \$ Z! S
- `. c" T; t9 e6 {
                               
登录/注册后可看大图
    }
5 W$ Y" P! y0 M6 Z8 o
- s1 k! @; n) W
                               
登录/注册后可看大图
    catch (string& e)
( g1 x0 b4 g( \" d9 v

6 C3 f) r8 l/ V, D/ ^" ^! n                               
登录/注册后可看大图
    {
- ]: G  U( C$ R1 m8 t: j, n- O' }
4 L8 j2 d+ V- s; @6 h
                               
登录/注册后可看大图
        return false;
  q7 e, E) C) M

8 k; [  H9 \* v, T                               
登录/注册后可看大图
    }* y6 N7 f( U, ]: i2 p; s
, d$ `' y% Z+ n% y, d" i6 f$ X
                               
登录/注册后可看大图
    return true;: e3 R% e7 h# o5 Z2 s' n( s
! B' H7 i, g5 C1 E$ x% m$ o
                               
登录/注册后可看大图
}) d$ M* @- p9 S7 d' v

  }+ C9 _2 }; q! j9 D$ U                               
登录/注册后可看大图
int main()+ h4 r2 w, }% j' \4 \2 R$ h! R3 w8 F
6 |  }7 y4 O* Q( F5 T0 S: B9 t5 }
                               
登录/注册后可看大图
{4 z4 E" G- Z5 B4 ]% K7 l

" C5 v4 a' L) r8 K$ p                               
登录/注册后可看大图
    string fileName = "info.xml";7 j. ~; c4 ^1 o- a3 v, h. p
. Z0 w6 `2 ]& N; r6 O" ]
                               
登录/注册后可看大图
    CreateXmlFile(fileName);  \* x7 H4 t7 x  i/ x9 `7 F

3 W$ s7 B* Y/ [                               
登录/注册后可看大图
    ReadXmlFile(fileName);
6 k& ^7 O% Z4 Q; W5 a, G

" p; y# J, f0 q0 N                               
登录/注册后可看大图
}
; L, K% j( m) ?9 x3 o- o' v: \4 ?$ C
( n3 [( D1 _2 A* l3 W
                               
登录/注册后可看大图

( ~3 m. n8 V9 g" E9 R* @- z* H, x! a7 J/ g0 J
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

0

主题

24

回帖

121

积分

注册会员

积分
121
发表于 2015-1-29 19:28:56 | 显示全部楼层
学习了 请问是从那本电子书转载的  / z0 t7 E- O+ C5 }) n: A! }3 T
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了