PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

2015-1-29 19:28:56 4544 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片段:
5 m" I; u. w8 ^7 O9 a  g$ x0 C

- q  r1 B3 Y1 O3 M& N2 o                               
登录/注册后可看大图
   <Persons>
, }$ R# E2 A8 Z& X, t4 Y0 S4 U
1 Z2 r/ o% r: p9 S
                               
登录/注册后可看大图
        <Person ID="1">
0 {; P% e6 e* D
3 Z# A7 v1 V: G0 B, N, K' D
                               
登录/注册后可看大图
            <name>周星星</name>
, d( I4 n- u. d1 ^( O1 P
' \9 \4 ^2 t( a# g! Q2 F. p" ^
                               
登录/注册后可看大图
            <age>20</age>
/ e4 j" a; u, c# {2 G

% x( W' e% l( L+ ^" G7 J* ?9 p                               
登录/注册后可看大图
        </Person>, ]. `4 x7 f& r: p3 ], o

/ {! m* p& d! q5 d; J8 C                               
登录/注册后可看大图
        <Person ID="2">
* k1 o+ r! V4 C7 c1 u

5 h# v: k" J8 F" [) G                               
登录/注册后可看大图
            <name>白晶晶</name>
- M' c3 q8 b% f& `! K4 e2 _
% h% r: }% h& o% j6 K
                               
登录/注册后可看大图
            <age>18</age>
- D2 Q, ~2 l6 a( n, i! E# {; k

! q5 G. x8 y  m9 D2 Z                               
登录/注册后可看大图
        </Person>
" f# `+ Y  S4 n3 X

. h' l2 {) w1 j1 }% _                               
登录/注册后可看大图
    </Persons>0 o+ d! W$ L/ @' O. p* g: _. r

! M( M5 @7 V) A                               
登录/注册后可看大图
- A+ b5 q' ~+ M3 \. `& [
在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文件:; b& f7 j) J" G/ }, p1 R* \
& S) m) @( I5 A" @1 m$ Z  `
                               
登录/注册后可看大图
<Persons>  [  F; _  p# Q) H/ H5 y3 k
7 [1 R9 b) ]  O. {0 }$ w* y
                               
登录/注册后可看大图
    <Person ID="1">
3 \+ C: p& v2 S* q1 e

  a% j2 M" E; Q7 ^# w! t                               
登录/注册后可看大图
        <name>phinecos</name>
# [# {& k* F/ X2 H

8 H) Z! p# A- p                               
登录/注册后可看大图
        <age>22</age>
& z) x7 n1 L6 M* j$ o

" o/ c; W) F7 G' c                               
登录/注册后可看大图
    </Person>
2 C7 V% F/ t& d/ u/ H  |

9 X/ ]$ w6 ?" w$ y4 k                               
登录/注册后可看大图
</Persons>. R  e# H  r6 X  u9 n9 k) A
7 d* S$ f$ x2 F( |! K: u; s) p
                               
登录/注册后可看大图

3 v3 W/ |  _9 b. q, z! w
读写XML文件的程序代码:  E- e+ A% N* @% a8 p9 Z

& K; h5 s2 G( ~/ m                               
登录/注册后可看大图
#include <iostream># g# R/ k  R! n3 p
! ]0 P! B# F. y+ n7 l" R
                               
登录/注册后可看大图
#include "tinyxml.h"4 y0 D$ e- f' B5 `7 }" y
% z' r3 B& @0 }) s
                               
登录/注册后可看大图
#include "tinystr.h", g" b/ U  ?1 ]  h3 s( l4 ~7 U

+ a2 v2 l( c- [; Z: ~$ J0 C4 z                               
登录/注册后可看大图
#include <string>0 g/ L8 q* t0 X. n
1 f3 ]" J- u% x, [# n- A
                               
登录/注册后可看大图
#include <windows.h>
1 D- m  P+ w- C  P

2 z4 p* w" A+ j9 s6 ^- C                               
登录/注册后可看大图
#include <atlstr.h>1 F+ G+ E$ i* b$ m1 }6 p% x* O
9 `9 h, o6 x( f2 G% E& Y) n
                               
登录/注册后可看大图
using namespace std;
3 L1 n; w9 K% y0 [

9 \$ i5 p5 Z3 |5 a                               
登录/注册后可看大图
" @3 R+ H+ |, j  a" w
- j% `" Q" i( v1 B0 m
                               
登录/注册后可看大图
CString GetAppPath()
4 R+ ], M4 z8 l5 H. `% d0 p* |, ^7 K

  e# T3 N1 R+ v2 e9 F                               
登录/注册后可看大图
{//获取应用程序根目录
! E. ]3 L  ?/ S' A5 m: ]* |1 `8 n
  Q, F! Z+ s& g* S1 V6 b
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];0 ?) R2 ^7 g, [9 b. w

# F$ T- n) T2 |5 ?- F                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);' S2 j' p5 U* o  i% w/ }) e6 ^
) k  p: U6 G' W1 ~! ]- L/ n* ^) d
                               
登录/注册后可看大图
    CString strModulePath(modulePath);+ `% y) e3 J( K

  {7 \/ f' x% Q" b6 y8 ?7 T                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
4 `! j+ r/ Y4 l! b
- l  B; x) e" g' z5 U2 V
                               
登录/注册后可看大图
    return strModulePath;! j0 O/ a, X1 v- R
  p* v& X2 x- \2 o8 p0 J
                               
登录/注册后可看大图
}  A5 b  c7 v, x  Y( n+ {$ V7 X& o
. t. B( ]6 F9 Q  R' h0 s4 Y6 V; n2 O1 V
                               
登录/注册后可看大图

% l- C' A% y. T3 x7 A
+ q" ^3 y1 x7 _7 Y
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
$ Z7 l) G1 T: h( K
$ f& A, K/ n- Z) |( d
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
. d4 n+ o. t/ d: x

, Q) b# G5 J1 G" D: l' [4 ]                               
登录/注册后可看大图
    try- k: {8 O) Z  P+ X
2 x* n# O0 h9 _$ W
                               
登录/注册后可看大图
    {8 w9 I3 a& x$ x% s. \
' o# c5 _$ _- J( s  Q4 \1 e
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
1 {# v6 k0 {4 j! L- R
4 C  A8 \/ _0 Q3 q$ a& Z! z
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
2 |0 z9 x& u" D  r/ B3 k4 m

/ Q0 E3 n5 e/ O: Z' z9 o                               
登录/注册后可看大图
        //创建一个根元素并连接。
& @" Y6 W3 H7 b. S: l0 G

7 K( q8 B2 f- V1 d                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");& r& v' t* B# v% _4 k
' W% C# d8 C& Y$ b$ I% e
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);! [# V" ]) ]! U6 j, C* U
3 m* I  P  f- c, x7 E
                               
登录/注册后可看大图
        //创建一个Person元素并连接。! k1 {. P8 u6 h8 u; I

2 i% G9 n; S" ]% S5 W0 r                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");3 T0 q8 U4 F3 b0 c0 t% f

4 v# ~( T& l9 ^  u# a                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);7 d9 o+ `- N' [) q" u; M
' W6 a; Z* F  g  _! m" p3 e' p
                               
登录/注册后可看大图
        //设置Person元素的属性。% `/ M. u, m! ?: M" |1 C( J8 K

3 C5 A1 z' T% \  C5 j4 r0 r                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
0 l2 N0 E* P& N* J
) v. U) X) i4 P: c; k
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。9 r6 n: w7 |& F

0 _" w3 A& c/ B/ y- p2 h; C& y, N                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
, J: v9 `* r6 ^3 H+ v

( f3 k* x$ v6 p( M5 P. c" c* h6 Q                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
# X6 c$ c- D0 A0 n) Z' L& L

! |! G6 p1 I6 c6 m5 d                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
: V1 R% I7 a1 ?1 V
, g" Q6 n8 t( L  e. g& B. n
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);! N% R: S2 S7 [6 u  r

  `+ g; M9 |& G# p9 w                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
. S0 C* L" f1 b& f0 m# Y9 H
6 X1 O  I. Y) g2 R. {  M5 |9 l
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");8 R+ S2 P( C0 N3 _7 M" u; P1 [

0 o% z) l* I# O- f  F, y                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");5 R' m: }4 k. O$ _3 t

7 d+ C8 V5 {! E9 b0 s                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
3 f& c  x  d1 y, q7 c
. Z8 H8 F* z7 }8 f( F
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
; @% x8 }& B; b2 H! D5 X

) T" U5 q2 L! _2 H% u. k                               
登录/注册后可看大图
        CString appPath = GetAppPath();" [2 G+ m3 q8 ?

2 H8 j# J( T8 r                               
登录/注册后可看大图
        string seperator = "\\";4 f8 r% G* v' c8 N5 T; e
" T( @& ]" G- b9 r7 j
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;; V2 t1 w- p) F

, P$ m* F4 K  ~- Y. ?; D                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件0 f, u0 T5 V  V7 d9 l, D; S
! T9 |. I% t# q& n4 M
                               
登录/注册后可看大图
    }
7 i: ^- x; `& L6 b

- J; y! e. ^4 A5 j                               
登录/注册后可看大图
    catch (string& e)# b0 o3 |% P- M- y0 A2 }+ r9 H

% c& R! @! U  X  E1 @% w                               
登录/注册后可看大图
    {
: `2 \( I/ C8 V: Z+ |

& o& ?9 n5 q' I$ y/ U                               
登录/注册后可看大图
        return false;7 y2 t1 V* f' c) g
$ R+ q9 `; _# G6 k* d
                               
登录/注册后可看大图
    }
9 |- x: V6 v- `# K3 L- Y4 P5 \+ l" t  s

" |5 n- O) n8 ~8 K0 ~+ [# i- Z                               
登录/注册后可看大图
    return true;
, ^! w" P6 H6 F! J

2 N3 T' U6 u/ @- c                               
登录/注册后可看大图
}, x" G2 s$ e8 L- z% b$ o& v
6 l3 R$ A! Z+ q
                               
登录/注册后可看大图

6 u( v' u  v4 L: |% C+ s

3 H) C6 ~3 V4 |6 o5 J4 T( L                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)% t8 f8 N" g! i7 j8 ]0 z8 T- ]1 [
, e+ _) Z* t7 F( v. Q. E" D6 B) ]
                               
登录/注册后可看大图
{//读取Xml文件,并遍历( L9 z  F1 D* x3 A: }

2 n: p+ p7 Z8 ?9 B' m                               
登录/注册后可看大图
    try
2 p2 r* \7 \2 B+ s
: j1 n0 P8 X9 q, ~, G& _8 }
                               
登录/注册后可看大图
    {
/ y1 b& L8 U# g9 S- _

4 m* r: g# b9 n* g                               
登录/注册后可看大图
        CString appPath = GetAppPath();  v, @- J3 [) A. H6 d  c' z

" j1 t# @8 H+ [# @9 Q( E                               
登录/注册后可看大图
        string seperator = "\\";3 M% V7 Y6 `& z' M9 q

2 F/ p9 g8 U! h                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;% b; I  N# O. ~! i# ]' n) @

# s" f" x6 u8 G& Z                               
登录/注册后可看大图
        //创建一个XML的文档对象。* Z9 T9 e& X* u9 D4 v$ r

' ^3 p( p& d: l6 n% S3 A                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());# R7 t0 i2 p4 t9 c7 X0 m
' L. V$ q2 g4 j( J) Q) z! x/ M
                               
登录/注册后可看大图
        myDocument->LoadFile();, u+ Z3 G9 E' I0 S9 B
0 p2 {& e, o5 N4 n5 M) N. N, H
                               
登录/注册后可看大图
        //获得根元素,即Persons。
# w; B- a9 I; I# K1 ?; v. z$ v
% V& c3 w2 ]+ g& a- X! U9 J( p
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();4 ^7 R2 j# @: m

4 m) B2 q# P) w+ x, _) f+ M                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。7 j: ^# N: M, Q9 e6 r9 H

1 K3 J+ [) o. P/ h, n                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
! O% e, U) ~; m: ~+ w

. l' V% Q2 O' ^                               
登录/注册后可看大图
        //获得第一个Person节点。  {; n0 j/ Y. ~. o
: p: G, Y" `0 ?" D( X, \: j3 |# B
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();2 q! H; }2 y5 O

- J8 u! n7 w1 m4 H3 F( m- w                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
8 s0 j- E6 n0 F! `& `2 D7 B5 s
' S; ?0 X& s& }# ?1 D. h
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();0 z: q8 @4 L/ V  T$ {+ l( H8 G1 j: W
$ Z/ {4 ?+ W: t8 z# `& b
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();4 \$ g7 H3 k! C0 u1 W+ G

% ?0 A/ f4 j* [+ Q                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
" I8 e2 s+ q( _) A
; Y! i4 a) t" L1 s$ {
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。- d3 J$ z; Q5 D& n3 Y
. k- i) V# {! l- l5 a5 c" t* X
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
9 a7 a: K5 C- T( z# ]6 O* a9 U* `
4 ~; {# T9 T! p
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;* u4 E1 Y" F( s! V) x
7 r. a" W) i' G# _, F" W
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;6 O6 k; Q7 M/ ^2 H! o; G

  w7 O# {7 S& i4 ?8 s3 @. W                               
登录/注册后可看大图
    }# E( {5 _$ T* B; B

% X0 ]7 b" p& a9 z                               
登录/注册后可看大图
    catch (string& e)
+ \  V, ?) R, m

, n: p3 S* T8 W1 F# Z                               
登录/注册后可看大图
    {! }( |1 h8 o! W9 j$ O; D: ^, |& ^
' ]( S1 }7 p! g$ l
                               
登录/注册后可看大图
        return false;) H, R1 m- g# |! u6 M, ?
9 n' n9 g6 F9 T/ x
                               
登录/注册后可看大图
    }
( ^3 O, B% r6 _, v

2 d  |: K; E; g3 U9 E                               
登录/注册后可看大图
    return true;. u6 T1 g+ y4 k$ M+ n3 I! @

9 o: Z" t! ^- v  O/ W" V                               
登录/注册后可看大图
}
* b& |4 f; `3 k
* P- v! T  }; H/ e, k0 s6 G
                               
登录/注册后可看大图
int main()
, ]- ]7 U5 t( h6 O5 Z

) F. }  n1 v: l! p! x$ k                               
登录/注册后可看大图
{
$ |/ ^, [+ x1 g

: G" ^$ J- {3 v7 m' B! U. H                               
登录/注册后可看大图
    string fileName = "info.xml";9 d3 l/ y3 }! g5 N9 l

" Z; `7 H+ `  z  {2 u8 A                               
登录/注册后可看大图
    CreateXmlFile(fileName);9 U( u$ `2 Z+ c* }
6 W  M- L$ d1 _# e7 H
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
& y+ i1 Z6 o  E$ ]3 Z
2 }3 `: i. _9 x- k3 j
                               
登录/注册后可看大图
}! G9 C+ D! n  K
! J' r0 i# G5 a' L. z  i
                               
登录/注册后可看大图

1 A) H# H, r- f8 h: ~9 g
# c1 e. s: X0 V1 w$ s
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
1 x% K' b! x$ F) h
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了