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

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

[复制链接]

2015-1-29 19:28:56 4559 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片段:
4 M( w+ j( p- k; D$ p
: T2 ]0 \9 j2 N* l
                               
登录/注册后可看大图
   <Persons>
& [" [* v8 Q3 W# J6 N$ q

1 H0 G. J) F$ m. ^                               
登录/注册后可看大图
        <Person ID="1">4 y1 {- O  |4 W

7 w  k7 }7 `3 Y- m, v                               
登录/注册后可看大图
            <name>周星星</name>1 D1 J. f; z$ W. [# @# y" Q6 \: f

3 x9 m5 \0 I: B% F) g                               
登录/注册后可看大图
            <age>20</age>
- Y. A  u: B  O0 D2 [( g

" I* i( _! L/ V3 w6 A1 D                               
登录/注册后可看大图
        </Person>
' x4 P$ X- ]& T$ t; `) m4 S

2 x8 o9 h' t) c( E6 N7 j' a, C2 u                               
登录/注册后可看大图
        <Person ID="2">
* ^! }4 N2 X1 O$ L9 `7 d2 c& G" r
4 I- S( x* J# c  ]
                               
登录/注册后可看大图
            <name>白晶晶</name>2 ^5 E2 c  d* t# b, h
% V' o+ c5 D2 e0 [7 P& Y
                               
登录/注册后可看大图
            <age>18</age>
9 X6 Z$ ]) E( G' }. h6 g
! s" a$ C* ?8 e6 S6 b" K
                               
登录/注册后可看大图
        </Person>) l' I3 e0 s; F. r

, j6 X5 C9 c2 Z5 D7 l                               
登录/注册后可看大图
    </Persons>7 t$ H" E" ~6 }) k" P1 X; v

3 {/ j# M1 s, k# o  g                               
登录/注册后可看大图
" }2 \- E% v  ~0 O. C, A  I
在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文件:
/ g* v, s6 n( k; o
8 \  M- |  G/ R! u
                               
登录/注册后可看大图
<Persons>' Y8 q  P4 m$ B4 Y. ?! t: }2 ]# I
  `- z: p2 x; e+ o- L7 [5 b
                               
登录/注册后可看大图
    <Person ID="1">+ c0 W* w: j) B) N) C
# e4 O  j: G* V6 G) H  S( k
                               
登录/注册后可看大图
        <name>phinecos</name>: `# b7 R( d* t8 w" R

8 _! X0 P8 S: N. B) l: P                               
登录/注册后可看大图
        <age>22</age>
: j5 S4 }! a1 u* |) b# u

9 g* @  e5 |' J$ {! p                               
登录/注册后可看大图
    </Person>
( @' i3 i% \9 s) b$ q) c& m

4 G7 ~  d# V, p: J$ ?                               
登录/注册后可看大图
</Persons>
' l. w' s) L+ e$ `
: d( {* A1 K; B( G. w
                               
登录/注册后可看大图

9 S; Q5 F7 j# L+ i" t" z6 `! c4 |4 ~4 ?
读写XML文件的程序代码:9 H: z+ `( }. a/ w

! C8 V! [7 M# g                               
登录/注册后可看大图
#include <iostream>
/ y( b, n6 h2 l( v8 q  p
+ `* _' l- I# b* l2 I1 x3 L
                               
登录/注册后可看大图
#include "tinyxml.h"
. z  R$ h9 J" C4 I) g4 N, J
, n% h" ^! {$ x8 W8 v
                               
登录/注册后可看大图
#include "tinystr.h"
- S" q* O" h: L0 `5 l
4 Z9 Y# p- F+ _, L6 m, g0 Y; F" z
                               
登录/注册后可看大图
#include <string>; l3 Q0 a1 Q8 ?" G
' N% H! O5 u. y0 t
                               
登录/注册后可看大图
#include <windows.h>, |  l6 x- C: v  v  o
! ]$ L8 G( }2 g, ~4 Q- |
                               
登录/注册后可看大图
#include <atlstr.h>: R! M7 v" l5 b/ D+ v( G+ {  Y8 j
# I" b3 A4 Q1 K1 c/ k* o
                               
登录/注册后可看大图
using namespace std;1 o  E! A- X6 l1 d

2 |/ M8 {* @! [' d! t6 s$ w- Q! \                               
登录/注册后可看大图
6 G; P( X  z1 |. O4 s
& @6 F! V' ~  a; l: n2 t( u9 r0 ^
                               
登录/注册后可看大图
CString GetAppPath()% s: C8 R4 P. C

( f) p" ?& u& d. ^2 Q: w. v! g. l( c                               
登录/注册后可看大图
{//获取应用程序根目录& \1 g% \5 ~0 u. v# t

# p1 l4 U* D( Y; D  j                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];% q# H# d; I- w' ~
: N8 q. b. G2 ~4 ^5 D# [; a
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
. J% I0 |; l! y0 R$ ?3 X& t/ m

+ _* r6 M7 c9 Y/ I- y( ^                               
登录/注册后可看大图
    CString strModulePath(modulePath);
" z4 H  C; l* Y6 ^2 W9 K
5 u# {6 {& g- l" e' E( P  b6 G
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
) Q8 W/ x. T$ d5 n5 B. e2 x

& j7 m2 O7 x& l; O' }6 c                               
登录/注册后可看大图
    return strModulePath;8 v; V7 y( y$ K: h* ]: \
1 v2 w) o: k' W2 ~! H
                               
登录/注册后可看大图
}
5 s. o) V- k* @% J* {

  g: x+ O3 Y5 y' t! w; T                               
登录/注册后可看大图

( O) j2 ^" z: w5 c& n0 {
2 L* ?3 S+ t4 j+ K& v
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
+ [$ g% h5 l) V+ r

* k/ M$ e; x& e7 d- g3 `                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
( n3 T8 o+ ?6 I/ d% k. j: C. X) n
8 p$ ^5 e! k0 i0 x' R
                               
登录/注册后可看大图
    try9 K. f1 u% y7 d( t. l
+ U+ z* h8 c9 J0 @& i
                               
登录/注册后可看大图
    {% {' e9 U3 {0 d  F$ d/ D
6 a5 d2 f$ M- m% _% m0 X
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
3 Y9 {& ^+ [. R

( I% e. P7 u1 ^2 a; G) B, i, I2 p                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();: I0 g" l- z! u, M) k& b' ?
9 [% o1 ^. n# D4 M6 o+ p
                               
登录/注册后可看大图
        //创建一个根元素并连接。* |$ u7 o# C6 W5 t  n

# E$ y1 k( A& ^' k3 J" T                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
" t$ M6 |8 o' K8 L

, s5 z5 p! B4 {$ z  B                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);' d% J1 K& r5 W! G1 h4 c
0 }! L! Z: s& C, I! u
                               
登录/注册后可看大图
        //创建一个Person元素并连接。
; D" z- X* y& n4 X

9 |9 U' g; }0 B                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");" I, Y; [9 K7 G* b

8 v8 f9 Y$ g7 |8 S. O: i                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);1 M" L5 W# Q2 f* y; \: Z1 y

" q/ }6 {+ `. l- @" j2 B1 G# {2 V                               
登录/注册后可看大图
        //设置Person元素的属性。# r6 Y4 K% {# Q3 k/ E  }
0 s) L# f1 k% s5 Z' d& @) l5 k# X
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
  k! r2 |# v3 k9 S2 Q. d. U+ S) q
9 r- A6 e) y, X! H1 b& [/ L
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。" k9 C+ O9 U& o+ Q# ^5 k1 n
$ M4 q% A/ `% i; W/ v4 _/ h6 \# ?6 l
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
( o5 Z* o. l7 a& n/ U
  {" ~& M- \! O7 G# j" O
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");, q  Z7 w* [( t+ h. s2 H$ p, L
& x4 K8 Y! n3 E
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);: U2 ]7 D5 G/ K  z: ~

& `7 _( @; Z0 j1 Z# Y; |( O% E                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
. s  |1 C- m8 j" r- @: C
; s, h, {! _1 r+ j3 U% S" t' B
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。; Z9 d6 B8 j& n5 G- a
& u& b; o. ]2 w# b* |
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
3 ?9 ^9 C' j2 @2 H3 M
% G( y' Q: k7 n
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
, {. `; ]- C% ^$ ?1 W
# J  T1 r  A6 p4 s% V
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
2 z& A, l) O; \
/ S" Q7 v" Q, D
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);- u9 i5 ]0 [' W, x+ x. R. A# G
: b8 S) _, {" ^& m3 }- [% o
                               
登录/注册后可看大图
        CString appPath = GetAppPath();  C# s0 ]8 C8 V8 E
  ]1 F7 t# I6 e
                               
登录/注册后可看大图
        string seperator = "\\";. H$ P. X" t: @; i. c

+ f$ m, \; \: e% D3 V                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;0 X/ D  d$ u7 \9 k( m' B
2 w! q" n/ w5 Q7 f, p7 V  W
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
% }3 }) ]% W  y
' C3 ^. u0 J/ m2 M5 _  E. i
                               
登录/注册后可看大图
    }
- h7 w" {5 f7 _$ |' W1 n" H5 W) P

* B) F$ D9 L( J/ U9 @3 W. {2 Y                               
登录/注册后可看大图
    catch (string& e)! v! o. k+ U" G! ?* I, V/ A

! z% m, _  `. y2 L" y8 k) ]                               
登录/注册后可看大图
    {" F" F9 s3 c: x+ c; j
" j. U3 n  p3 c
                               
登录/注册后可看大图
        return false;0 c) j& W* @- u: v
7 k5 b3 K9 Z) m/ z# p1 T) p7 g' v
                               
登录/注册后可看大图
    }* h0 f: B  v8 v. G1 r. \$ I

( K/ ]* ]  T: O                               
登录/注册后可看大图
    return true;
% s& l' }# N2 {9 c% ]: M
' G* v/ T6 g4 j1 m& }: J
                               
登录/注册后可看大图
}
! g  H4 [2 C' c7 P0 O; C
8 A- F, H8 `, I6 m  |
                               
登录/注册后可看大图
5 e' }# A  E3 F$ \" }6 S) ?( Q
6 T; R: _" R8 A& k7 N& K; Y
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)2 K) X7 U. i& @6 ^
& C" ^* [: S) x0 n
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
) t2 V( n$ j( X* R) \

# }! j% [$ N% N) {+ |6 X) Q# J                               
登录/注册后可看大图
    try
2 h5 b) a9 ~: G; O9 M+ m: T, R7 f

/ z0 i4 A# V1 E( w; h& z& G2 ~                               
登录/注册后可看大图
    {
* Z4 B2 e, Q  S$ Q4 B0 C  F

# C( _( z( A0 Q% ~  H" w                               
登录/注册后可看大图
        CString appPath = GetAppPath();
- f) \  `. O6 X% o1 u- L
" ?5 e  ?' C) m5 q/ }
                               
登录/注册后可看大图
        string seperator = "\\";
$ ]/ {5 E  W; V( m$ ]* r

6 U: b! p& u, ]  J. Q+ j6 e% k                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
- \3 M- |4 U- ?+ h

6 t3 D6 J" X! u$ D1 [8 ?! X                               
登录/注册后可看大图
        //创建一个XML的文档对象。, j3 [6 ^) O; N

6 R. a' c/ r2 E( [; `                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());5 f0 E+ }) d  j9 l$ P' D

! N+ n. R# d- j                               
登录/注册后可看大图
        myDocument->LoadFile();
0 E+ }5 D  v5 ]6 o( M
. F7 ^3 B9 N9 r) {( N; l
                               
登录/注册后可看大图
        //获得根元素,即Persons。
% @+ h  z  c1 X2 _) }5 j$ e
2 j5 E7 v3 }% ]6 ~' I4 g$ g
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
3 `& b6 e# o3 Q3 J7 Q* x! L/ e
% s$ M% ~/ G7 h; B
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。! Y' l2 K; G! k" s
  x& z. J* o& ^
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
3 K! g" O7 y9 v7 T

* Z! g& b5 u0 v6 u2 w$ W4 c* `6 ?                               
登录/注册后可看大图
        //获得第一个Person节点。
& t1 @) P$ _5 A. y8 o
1 N- `: ~, ^% s, Y( D! m5 ?9 t4 u6 U
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();, U" N7 Z) s  W- U! s  z

4 Z3 R, K2 I8 b6 O                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。( y* `. t7 c( \# c

0 S+ C( z4 O4 K: S. O$ s$ O8 E/ H                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
3 z" ], g3 k! B4 x3 e, g3 x

1 s1 {% m( Y. T8 a- K1 Y$ ]3 a                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();) u" J0 c" X3 _/ f$ [" h& k

5 X3 u, s# f9 ]% H" A                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();5 ]. j" U4 v$ V
) i4 H7 b$ v0 k& v) K" s; j# _
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。* X. d( w* ~4 t0 m1 S0 J/ S
, b6 P2 \- E! [
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;8 N! H2 L8 M: |

2 Q% i5 `0 v% [# f" p! [5 f8 H                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
2 G3 z' d" ~) r( d

8 r) F$ o& B4 @+ Z9 C& G6 }, |                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
2 ~% t+ D7 F% i: t

$ b) v& B- p/ X% I% l                               
登录/注册后可看大图
    }
+ V2 B( }+ ~! T/ K$ Z

3 P. q4 ~6 ~6 R4 h9 w) }                               
登录/注册后可看大图
    catch (string& e)
6 w" C& I, a! G' R5 @/ l2 ?9 p
+ B( v; U$ {5 h, p
                               
登录/注册后可看大图
    {6 i# T2 f- I3 v4 O2 M6 z
& x- v/ f8 u6 e6 z* ]( @' {
                               
登录/注册后可看大图
        return false;
  f) W! ?1 e4 c6 s6 Z9 ]% D
* K2 E! `$ E3 X9 |$ r7 `! p/ v2 |
                               
登录/注册后可看大图
    }- y# }9 z% i7 [, X8 F$ R
9 p* `0 t$ Y6 C$ E7 J+ _
                               
登录/注册后可看大图
    return true;
9 `( ]  v. C4 V( a. s
  o% D+ f1 T+ G9 e, I
                               
登录/注册后可看大图
}9 z! X6 z0 y. T! |

6 @% C2 o) O; X3 m" S. U2 U- z  E                               
登录/注册后可看大图
int main()
( Z2 P" k6 L7 b3 R9 N6 T

5 v3 [/ i: Z' O7 q                               
登录/注册后可看大图
{
, _. _' n2 x, l/ Y9 k6 Z% S

( j2 O4 f8 U! N8 s0 B                               
登录/注册后可看大图
    string fileName = "info.xml";2 u/ w  o3 Y' t" L. G- t, @6 C; @
' e' T  {( A/ k
                               
登录/注册后可看大图
    CreateXmlFile(fileName);7 z# s, n, m9 l/ F  o, v
2 [2 H) n5 Z( c0 `" ]
                               
登录/注册后可看大图
    ReadXmlFile(fileName);& d  H( K" h) d. N5 Y5 K/ v

! I) g/ ?; B/ C' Y; D- g9 i" H                               
登录/注册后可看大图
}
- i/ y& _2 ~4 y

$ |' ]# x* p& E! d                               
登录/注册后可看大图

) t. z- W$ l0 q- \0 M! S0 O7 [5 a$ b/ s  f# u; K
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的    s5 a- k% h* Y6 R
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了