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

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

[复制链接]

2015-1-29 19:28:56 4534 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片段:
, a; \* |/ a0 s8 F+ m6 A% Z' X

* n1 X4 b0 q: d' ]$ H/ x                               
登录/注册后可看大图
   <Persons>1 @" D! Z' G- ~7 t4 b' `/ D+ ]

. \9 y" \1 ^3 m1 U1 h* F                               
登录/注册后可看大图
        <Person ID="1">: h5 P% t! Y) W1 d1 `1 t! S

7 t& A" Z4 s9 l' V2 X                               
登录/注册后可看大图
            <name>周星星</name>
$ Z( N# y7 e! U, D
& B9 d# B9 h: n  }  l
                               
登录/注册后可看大图
            <age>20</age>9 H, q  w9 Z) M+ S7 _$ R
8 [9 F( Y* c9 z. N( @2 U( e
                               
登录/注册后可看大图
        </Person>
" D$ O4 @7 v  W5 c" m
( [( m; d7 n6 e7 W/ B6 l
                               
登录/注册后可看大图
        <Person ID="2">
. `6 |+ C, R( {

5 G( V+ R' }0 h- x                               
登录/注册后可看大图
            <name>白晶晶</name>
  x, J/ i8 y8 P" C4 y. N
4 `( }! Q9 k9 W& A+ [
                               
登录/注册后可看大图
            <age>18</age>
* x! w( e; ?2 H# s
0 b! e9 w0 {. f
                               
登录/注册后可看大图
        </Person>
2 J1 w' P$ C% Z* O. f

# W5 W7 q3 r% u; Z6 |/ w                               
登录/注册后可看大图
    </Persons>
! x! u2 h' U( H5 F

2 |) l1 Y7 J% ^2 ]5 @% \4 ]' m                               
登录/注册后可看大图
, Q* P( R7 T- 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! G% b; ^5 h( Y! t. X% b

. Z0 q0 d2 `3 C9 P3 u                               
登录/注册后可看大图
<Persons>
- M, b9 n% d3 r4 T& I
  k& Z# V" U. T- X2 _; v( y
                               
登录/注册后可看大图
    <Person ID="1">
; r1 \$ e( Q$ R+ f' f6 a- |
5 g/ h4 h- d2 G+ b; p
                               
登录/注册后可看大图
        <name>phinecos</name>8 l  \: O$ j8 c6 l. e7 r

2 G* X1 v, P# b- Z! |8 }0 s                               
登录/注册后可看大图
        <age>22</age>) G9 c* w1 N+ k* t% U. f
- P8 ?! Q  W4 }9 h1 {6 W
                               
登录/注册后可看大图
    </Person>
7 r; ^" H- G8 d$ B+ L' s5 Y

0 h, d2 l8 s* u+ ~                               
登录/注册后可看大图
</Persons>% S3 {9 A; m  C
4 W; q, W: j; o" |
                               
登录/注册后可看大图
1 s7 C+ Q. C' o/ I1 U2 K" l" x/ f
读写XML文件的程序代码:  a+ `+ Y0 Q0 N7 @( E3 ?% }% k

. Z) W0 E% L5 M: j7 N6 p% [/ r: |) P                               
登录/注册后可看大图
#include <iostream>" ~# ~: p5 @8 V
4 g4 q. D5 `' g+ B# k! l2 t
                               
登录/注册后可看大图
#include "tinyxml.h"+ e1 \" ^" m: [' U4 P) T% `2 p
6 u1 P  c+ M2 g' y, X
                               
登录/注册后可看大图
#include "tinystr.h"  h4 @! a' M) Z6 x4 o6 u

  s1 m$ \, n8 Q" W& [                               
登录/注册后可看大图
#include <string>
3 O; d3 V  L# N% i  a: }/ T8 D

( N/ F* T9 o9 W" e( E4 Q6 Z                               
登录/注册后可看大图
#include <windows.h>
5 |  M0 E% t/ u4 B7 p
9 a& p" f3 t, r& Z# ]% L, h
                               
登录/注册后可看大图
#include <atlstr.h>
' ?. |. M: \: |4 T/ }4 C- h4 h

/ i9 H; _' R0 N. k* A: e+ k8 \                               
登录/注册后可看大图
using namespace std;
* f, {$ U( I$ l
* L& k8 ]' M9 q4 [& c( ]' \
                               
登录/注册后可看大图

4 R: P* E/ y8 Z3 F; e" G
) c1 T+ l7 {0 V$ A7 [
                               
登录/注册后可看大图
CString GetAppPath()1 P2 q" r: W! {+ X& e

& _% |+ K/ l& \2 v1 H6 H' i5 S8 }                               
登录/注册后可看大图
{//获取应用程序根目录8 x  @3 C; u. v+ {9 I7 u# U
$ ^8 y' R+ r2 u+ y8 @" V8 b2 Q
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
" `$ j( y; k$ @/ m: u  v' c
6 l; t+ l' e- ?: I
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);& _/ F7 I3 R. n( }3 b

5 D! j+ B  ]3 `. F1 p% `                               
登录/注册后可看大图
    CString strModulePath(modulePath);
0 V. d3 Q& I- {: o6 q' D1 Z" f
1 c# o, ~0 B2 ~; e7 N$ n
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
1 O0 \  p0 x* P  `

9 f; L( w  k0 }2 \  V$ `, L9 I                               
登录/注册后可看大图
    return strModulePath;: s/ O8 G/ z( w8 a! F$ ?6 Z

+ e5 A+ M3 ]2 j1 r) D                               
登录/注册后可看大图
}1 N) G( l5 q& v) G& q+ k
; b: Z/ C3 k  H2 c3 Z+ l
                               
登录/注册后可看大图

$ k4 i8 X3 `9 U( l4 K6 R& u4 Z# [+ H1 n: F

- K! r  Z; L  g% w* o                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName), ^6 v+ O9 H0 q  L5 k2 B
. ~- Q  E1 [1 q: G5 l+ P
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
1 W. i8 l; ^- i$ K& W- q

7 Z9 V8 x  K* ~: T3 L2 _                               
登录/注册后可看大图
    try) f* Z9 \3 a$ P) S- B% K- p

/ a' L1 a; Y' n. V0 j& @                               
登录/注册后可看大图
    {* O$ O& a# F% C
$ i  L. h! Z! [6 W
                               
登录/注册后可看大图
        //创建一个XML的文档对象。1 ^) s7 j' G0 K) Q  N

8 h! C" a- S2 R: w                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();. s' c3 r9 Q* ^5 p' V

  c& U8 e) C, n                               
登录/注册后可看大图
        //创建一个根元素并连接。. ]6 Q! Y9 O- {% c7 l. b
3 ]3 |4 W6 d) {" E6 f. @
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
" g6 `2 c8 d7 L2 l9 m" u6 {
" q4 u- `" f4 c# X
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
) I* N+ \7 U8 M2 v

5 X  G( _/ ]9 D! H# u                               
登录/注册后可看大图
        //创建一个Person元素并连接。8 X& m6 W9 x8 n9 P# c
# |6 H( ]5 S, V9 w
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
$ U/ {9 ]+ N/ \! N6 H# U4 ~0 {3 j
  {* |' V9 T$ z7 y; J, A5 J9 k- i
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
' R7 c$ |2 U% q5 }( E) x3 I4 P4 |

, u5 b1 z# I6 s9 C3 N! s* |0 ^                               
登录/注册后可看大图
        //设置Person元素的属性。! V0 t3 I9 f$ G

9 s$ K* W7 U- a8 E' S                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");: _, U$ i6 F$ _7 ]* _( u8 m

: q: t$ F; H; u$ p                               
登录/注册后可看大图
        //创建name元素、age元素并连接。8 K3 I/ @. _$ j" A  q) _

* |8 C+ \! i+ s. J- b6 `) j                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
; [* L( j) i) `# s/ m( b

* b5 `- i5 B- S" j! p9 N; ~                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");( h. m& X- g2 k
% t4 d; b8 T. @! l; O1 F0 K4 W
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
+ \" V) D7 {. N# \

3 Z: I; l/ D9 j# K2 D                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);# T0 U4 s8 H* Z  h6 }/ G: t
, a1 h' L0 B. B! {! p
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
# w3 [: I& p* b
% P' w' X7 t! }5 H& E2 o+ ]
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");3 _9 {! X  _. L; g9 \
) q7 {+ d+ q3 `* T( z) o% ]6 o
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
2 J/ q! D* e" y" S

' O3 E% _; G6 M" [                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
- r! |+ c6 y; _- Q
; @) M, E% o, L6 \, f1 I; _
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
' S% p+ J4 L" y

' y% e/ K4 B- p6 n# k4 Z                               
登录/注册后可看大图
        CString appPath = GetAppPath();( X' ]; s6 r# B: O8 T; L! m. `% G
5 |; {3 o( L3 y
                               
登录/注册后可看大图
        string seperator = "\\";
% k# K, \- H; e! u1 V

  f; F& D4 S$ t2 {$ R                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
$ @3 N4 O' s7 N2 D
4 P; h/ X9 m: \/ |# Z' L% M. r7 V
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
; C. f7 v+ y/ Y' b. x# g
5 z6 b$ P5 t; ?4 F7 E  f/ L$ V
                               
登录/注册后可看大图
    }
# H# O5 ~1 E# o( g4 [

0 s+ \7 {9 P  L6 L: [7 t* Z- L                               
登录/注册后可看大图
    catch (string& e)
, d8 U  d1 o; Q5 j7 E" e6 W$ r

/ A$ `" w* o; @' @                               
登录/注册后可看大图
    {) ~1 X! E3 R% u

" u) S, ~5 `( M                               
登录/注册后可看大图
        return false;( ]' Q6 ]% Q) {; ~& X
  j9 e; }- f1 }" K; ?* ^0 ?3 Z
                               
登录/注册后可看大图
    }! [7 [) ]7 F6 |# i6 N0 L

" f3 _4 E& t  l+ \+ p' h* y! e. J                               
登录/注册后可看大图
    return true;; ~0 b; X% W: u$ l: \$ [. I& ?
, N4 C6 h0 ?1 z3 Y
                               
登录/注册后可看大图
}
0 N' x7 O1 `! v& Z9 g/ }( Y1 u
' D' t  M# d  T- z
                               
登录/注册后可看大图

8 }! x& y) H3 p/ Z% z/ b( y
3 F1 \5 n, `5 z+ W- N: n" m
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)# c, \' y, Q0 B4 S* j

: k: _/ o3 f5 X( y, s) t5 l                               
登录/注册后可看大图
{//读取Xml文件,并遍历. |& P  B) U% o- c
3 {, U6 |) @$ y" W
                               
登录/注册后可看大图
    try! G* l3 P, G0 B" F) j
% K4 @0 ^& D7 J7 }$ o
                               
登录/注册后可看大图
    {
0 K2 r8 n/ `" \! b' I: G$ o
& ?3 g; P6 s! j5 w
                               
登录/注册后可看大图
        CString appPath = GetAppPath();( U! I$ h0 g. s

$ f3 l* Y! i; P! Y: V                               
登录/注册后可看大图
        string seperator = "\\";
/ I0 V; ]  m% ?0 T8 r* e2 h

' U9 m( f0 N; ?! T4 g( X! U2 s' i                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
# q0 O9 H# q8 X' C: [9 |- _8 }
: F7 t; M5 m$ r4 U4 ?8 z* _! m/ ^
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
/ x1 O* h% @/ w5 A" Q

3 j5 b8 x3 M! ], V. P: u5 J' p# ^                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
! s  k) W: f" @( J  w- n* ~3 f
0 u. `* l- K, w9 r% W" I
                               
登录/注册后可看大图
        myDocument->LoadFile();
7 N: x0 n2 m- j4 F4 P3 _% }

3 G/ i- S% V' B/ w( Q2 L                               
登录/注册后可看大图
        //获得根元素,即Persons。8 s2 `" J6 U7 @: d8 K* n5 @
! \( T# f9 Z, N; f6 R" w/ r) d7 _
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();$ T) ?+ e$ ]2 w4 g: |5 J
5 J! N9 N* ?# j7 c% |1 i
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
' G8 d; h6 F; K+ T0 @
3 u2 l: c6 C" U/ F0 u, w+ k
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;: i/ \( F" Z+ [2 B6 \" y" Y' a
& q7 z; m* k: @" T, x9 E/ V
                               
登录/注册后可看大图
        //获得第一个Person节点。
. y. n# _7 S$ z/ A9 l6 D

7 s) A1 D7 {: a6 M+ w, n  X                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
0 e) |" o2 X: ^: D% ^+ i
4 `! B! d$ |1 K. q2 K
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。7 c5 k: L! G5 \8 W

/ K" e, ?: b* w( }                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();: K5 W% |1 w5 q6 {6 U7 Y0 c
; m1 K" q& d: `& L+ O
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
9 s" b! A7 B0 _' c# q1 V

7 L, a( q. Y7 E1 G+ d                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
7 R8 q1 ~$ Z4 t& a/ c

7 L+ D1 ?  e3 @2 S  j4 n                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。2 z3 P. v, l% v
  x  ]5 t. C$ W- T2 F
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
  ^$ n9 B$ U& ?9 W6 c

* D' ~' {9 Z2 p9 w- e) {' m% W                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;1 f& z, L: d+ |9 D3 U

3 `" V8 @1 I  o+ U) q% d: }                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
4 G( T7 q* L0 q, Q; r- M$ ], a! A7 N
- C" p- ]" O# a- [6 _
                               
登录/注册后可看大图
    }8 c+ z: A; y# G; Q; b

0 R# i# k% g- W# m" g3 ^! A& Q5 K& ]                               
登录/注册后可看大图
    catch (string& e)
+ |: `) H% }, J2 u' b+ m7 N( b

/ d! K4 A" k( x                               
登录/注册后可看大图
    {
! I) O& B6 [& a
  Y+ H3 x# P0 C7 X8 I
                               
登录/注册后可看大图
        return false;, j* v+ l& M9 r: D. @( Q# }

% s: y0 h$ c( q/ B7 k4 M                               
登录/注册后可看大图
    }1 D9 ]) m9 d+ ~) y- n
" z. w" y: D" u) U( E; O$ V. Z; x
                               
登录/注册后可看大图
    return true;
  f9 r( Q; z3 f' u8 c
6 [* v8 y- o& V/ M' ]: T
                               
登录/注册后可看大图
}1 E3 m# g$ r( }& k

9 s. M4 U' R5 w" B                               
登录/注册后可看大图
int main()4 B# {4 o- t5 J4 j+ o
5 V/ R( V( X  o" U& h
                               
登录/注册后可看大图
{
+ C3 d  j1 X- Q  A, f- _3 t- N
8 M- K- G# d' q: Q
                               
登录/注册后可看大图
    string fileName = "info.xml";2 a0 W$ e  k; W! d0 s
. B, j" X! \9 @0 r3 p
                               
登录/注册后可看大图
    CreateXmlFile(fileName);$ H2 Y- k/ {" j* V. _8 n

6 r/ E0 U. p  v# e; O& J                               
登录/注册后可看大图
    ReadXmlFile(fileName);. F! Q; A3 i0 T2 R1 ~& j3 G; |

$ {' h$ ?& m8 _: m) v                               
登录/注册后可看大图
}
) s! L* Q4 F/ n( A/ L" L  K
# n1 `. Y4 N' @
                               
登录/注册后可看大图

. e& Y+ p1 a- N6 b  r5 c* u
" g6 |: r& O6 ^/ b, |6 o, Q! A
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  ; j0 O$ `& x; q: k* w8 @! 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二次开发专题模块培训报名开始啦

    我知道了