PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

PLM之家PLMHome-国产软件践行者

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

[复制链接]

2015-1-29 19:28:56 4084 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片段:  T$ L+ q( g7 f, d

5 Y6 p+ o# O9 O( n' ~: s& \                               
登录/注册后可看大图
   <Persons>
; G/ Y4 [, ?+ r) T4 D

  W& m1 [. w+ k                               
登录/注册后可看大图
        <Person ID="1">: I# I. X5 r) A  D

4 L: J5 I4 e; `                               
登录/注册后可看大图
            <name>周星星</name>
' U: W# Z- S0 J

* L7 _* z& ~# s( `                               
登录/注册后可看大图
            <age>20</age>
6 o. y! G$ E/ q. y# v, K
/ |; a# q1 d! m) w' V
                               
登录/注册后可看大图
        </Person>
# @6 s6 i7 i! s2 D! g+ I7 |1 R

' A* y$ ?7 |- `2 {4 q                               
登录/注册后可看大图
        <Person ID="2">
# y% Y7 Q$ @* T1 T1 ?
0 U, N$ H. N5 ^* E# i7 l& v
                               
登录/注册后可看大图
            <name>白晶晶</name>
' O4 p" T% Y! |

+ R- r% w$ V/ @5 [! p: d; h% m                               
登录/注册后可看大图
            <age>18</age>$ a3 }: A4 K3 F8 B! S

% f& q# J% E, f8 h                               
登录/注册后可看大图
        </Person># V% ]+ A( s. f) {1 w

  [) i# a% Y( }6 V. e: N: @                               
登录/注册后可看大图
    </Persons>. J" B1 B* c% R( a7 x- l: l

0 M3 Y; S" o* S$ K) B) ?& K                               
登录/注册后可看大图
5 N- M: ]* W* G6 `. z
在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文件:2 `, s3 ~# r6 K. a0 R

$ s  P: Z. \2 N# t* e                               
登录/注册后可看大图
<Persons>; h! u, X4 e# M  f& }

! \0 {" y2 D. u9 B8 n% K; G                               
登录/注册后可看大图
    <Person ID="1">
# W8 f6 a; I) s

$ J+ L9 ]5 p& v( `0 h                               
登录/注册后可看大图
        <name>phinecos</name># u3 \9 ]1 Q& o) H# Y! t0 G7 q

8 o3 a# }9 b& i1 @- f                               
登录/注册后可看大图
        <age>22</age>
/ x' r( A9 |! N7 ]: b! L

8 e; g& }4 ?8 M8 m/ O; h. [& F( x                               
登录/注册后可看大图
    </Person>
4 l4 t2 m0 K9 t

1 c8 O# ]) K) L* a5 ^                               
登录/注册后可看大图
</Persons>
. Q& \" ?/ Y2 h
# X4 t. B! v0 n! W' i7 s) G- d
                               
登录/注册后可看大图
' q4 W; i8 ?' D2 q- T' o
读写XML文件的程序代码:6 a+ t& S8 M" T/ ]
1 o' A, S3 {+ j" [
                               
登录/注册后可看大图
#include <iostream>+ O, x) [% Q, W; D& T

& O, Q& e& c% p, m( S3 r; T                               
登录/注册后可看大图
#include "tinyxml.h"
* Y' l: A; P8 R5 m
  j1 W/ R6 y9 T* t; S! ?6 b
                               
登录/注册后可看大图
#include "tinystr.h"# ^: y$ r3 ]* A9 J
8 H8 a2 o/ [' W6 N' [2 @# I
                               
登录/注册后可看大图
#include <string>
4 a0 c. `1 S, f2 E- A) v$ o" j
9 f% V3 Y6 D: n: `; h  \
                               
登录/注册后可看大图
#include <windows.h>
8 E* E5 c: w+ c: P& b4 _
6 n2 J1 m) D7 d) f2 W7 F0 m) x- w2 z
                               
登录/注册后可看大图
#include <atlstr.h>
, B- [! o3 D+ v- V

3 E1 l( _) a- A7 x" D% @                               
登录/注册后可看大图
using namespace std;1 ]. Q6 U9 H/ c: P0 d+ f+ U
( S% F& y+ y/ F7 |7 G
                               
登录/注册后可看大图
' J! }+ F  M$ \

9 `# t8 j, O$ N! K# ]: E                               
登录/注册后可看大图
CString GetAppPath()
3 r+ r3 a- O2 N

( d" r: B/ {, p$ U                               
登录/注册后可看大图
{//获取应用程序根目录4 z4 F* ^. o7 j$ V  W
; D' D: B  f; ]# D8 ^& r
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];6 X; {+ h# E  Y6 y, S0 ~9 |
# n9 u% w3 W: e/ Q; v
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
3 Q* a# `* @" d, y' R6 _
; Z# O2 y$ x/ s# H
                               
登录/注册后可看大图
    CString strModulePath(modulePath);2 _4 h' C) K" Y# _' C1 u6 ?) W

2 }( o$ ?* h9 o  L* ]9 Y  B3 a                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
. j4 U; S5 ~8 |

6 S% a4 P9 _1 M. A3 H1 r, H* B                               
登录/注册后可看大图
    return strModulePath;
$ }' ~; L0 s" Y2 q3 [3 F

- Q) P! @4 Y0 _" b( P" E; p5 X                               
登录/注册后可看大图
}
1 o' d! b) B8 v3 p& t/ o7 l+ `' x
, h6 R' `' n9 I/ V0 f# g
                               
登录/注册后可看大图
% c7 u8 O: c5 o
: s5 ]) e9 t: x4 H
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
6 V8 K  Q& u, |* a

2 h! V8 e4 }, w6 {) E8 u6 X                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
! s# J# X# m2 A8 R9 A) S

2 |8 e  y" B# w' n  \$ N, {2 {                               
登录/注册后可看大图
    try2 L$ _6 u; A% _/ X. V$ A
! \' |- a% V" R; }" l# j
                               
登录/注册后可看大图
    {
7 F4 B$ e! C% q, S+ Z6 o
" l7 M+ |3 q0 O4 t$ ~( g4 a# l
                               
登录/注册后可看大图
        //创建一个XML的文档对象。, N9 M. u7 b7 n
( t) ?/ G7 K. H" \+ x( e
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();" p. d: P# v! {1 T. h
! U  D3 G( O) K; \4 }" v2 w% F
                               
登录/注册后可看大图
        //创建一个根元素并连接。
$ B( W2 R8 |5 v3 e6 C

6 H. @& V4 W3 x. l6 T                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");# d. d: ?, ]/ p9 [' P9 d5 d
; ]$ `0 `( x4 e$ B9 x; f# _
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
8 {, `( E' R& \3 U

3 k0 P' f8 z/ p" ?2 t                               
登录/注册后可看大图
        //创建一个Person元素并连接。
* x! \9 D4 t; w+ g4 S

& ]0 W. S) ^5 U+ j                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");9 b: _( V' K4 J% M3 H0 ~

! O4 v% Q  @6 L& c. S! ]* V2 F                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
9 m, ?: T( N! n$ L0 o' `

. n& @9 p; W% M7 H1 x& C                               
登录/注册后可看大图
        //设置Person元素的属性。
, ^2 V: Y, y/ j/ ]- g: I( ?

$ \' m3 \2 W/ B3 o+ _7 \. p1 C                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");$ q( ?7 a* c' b( R3 ]2 [& F

5 n$ {/ `* ]& s4 Y                               
登录/注册后可看大图
        //创建name元素、age元素并连接。+ D! v5 q) ]7 F

) F! T/ N2 T, y/ Q                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
( w" z/ Z# w0 n
9 @) s3 d- @. ^
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");' Q8 B9 ~) j$ K
8 ?& a/ Y: Y8 j( g2 I! r& `
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);' _4 E4 z( a7 w" }
/ x0 B+ n) A& z8 k% I: H$ n& G4 X2 Q
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);5 W' N7 V, ~& B$ F% n9 ^+ F- h

9 q0 k. Q7 H/ h! d( b# p                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。5 l5 Q2 ?' C( Y5 k7 l
+ t. [  ?, C: y( }2 c
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");" V' e$ P( t* y- y7 }( M: F- o5 t
, W" E0 K# ?4 b% H# D! {
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
2 D+ H2 _8 w  }9 O- E

/ p$ I* P  \! k& S; i# R/ W                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);0 j, i) Z0 ]5 A/ j; l

" j& h( N: \% U. u# E# }                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
7 r+ h& C3 F) L+ U) C
! u' @; C7 R0 o; d" p/ i
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
1 f7 N$ h- G( h# A& Q! a* F

9 f' f1 H7 ]% {                               
登录/注册后可看大图
        string seperator = "\\";
+ d" M/ I: z; `& K1 ?
' D8 \9 z- w( Z( O% P9 k
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
5 N- [* j2 |: I
9 x$ S" y2 ]5 |2 t$ Q
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
; H+ r( }$ D# {! z& H% e
  g6 ~. B1 X2 q$ t5 z0 b, M# T
                               
登录/注册后可看大图
    }- I% b9 x, I) \' D8 m

3 s, v5 j) s  ?. F/ P6 b% \                               
登录/注册后可看大图
    catch (string& e)# q; I* I9 G# F9 e: m% A9 c

: A) S9 q: m/ g3 y# r& Q                               
登录/注册后可看大图
    {; n: j2 A5 c7 c# @  A  P. ]0 g
& l6 H8 B1 M4 J. J/ W& P) |* Y5 k3 \
                               
登录/注册后可看大图
        return false;
; w- k5 a% |3 Q, ~+ Q
% g, t1 @. @: l+ n  q
                               
登录/注册后可看大图
    }$ F3 p( K+ N3 ?/ P6 A* o7 o

2 k- B/ T$ E" ~                               
登录/注册后可看大图
    return true;, @, t$ ?" _, o+ D

6 l5 l8 M+ ^3 Y% u% J3 q, F; N                               
登录/注册后可看大图
}1 f3 b+ d- I9 {6 ^, |9 A$ H

8 K1 m" Y, i# W: q. c6 i! ~, }$ Y                               
登录/注册后可看大图

9 q+ o5 e* Q* w8 P; m( j) \2 e
8 y1 ]$ {5 u# C# w
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
  S6 x: g5 |8 |. o1 n5 R5 U

! w2 l. B# [/ p: Z" g                               
登录/注册后可看大图
{//读取Xml文件,并遍历0 n/ [  w8 r* [9 O

( J9 D1 ~/ o+ Q                               
登录/注册后可看大图
    try
/ k$ r! J- d- r/ O  }! [, k
" h0 \: S% ]9 v5 L( [& U
                               
登录/注册后可看大图
    {1 h) p% i, C( T( K, w: [( X! @6 }+ g

2 F/ q! I' Y; N. b                               
登录/注册后可看大图
        CString appPath = GetAppPath();
( |4 Z6 f2 e' d' {
) K1 `; e, T! A6 @9 c
                               
登录/注册后可看大图
        string seperator = "\\";
4 \& V! _; a. V9 x) W4 v
$ @& P+ E. |: z' \: Q) P
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;6 ]: k/ N1 U/ B  d- r$ |( @( z

  ?. k( ]8 q" t$ I                               
登录/注册后可看大图
        //创建一个XML的文档对象。- l1 v  B2 i/ `$ u. ?8 t
) u& Y0 d* h& J# W; Z
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
8 i$ J7 N+ ]" C0 C& Q8 Q( A9 H
9 f9 b3 K  `: U8 }
                               
登录/注册后可看大图
        myDocument->LoadFile();
1 j8 e9 D: h% W* w$ V  J6 }
  S" l, w4 h) g' X2 @
                               
登录/注册后可看大图
        //获得根元素,即Persons。
2 g# b5 @* G( w$ q7 e9 d

8 ]0 X+ d4 @- b* |/ R3 b                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
3 X% T4 z4 Q" p

8 @+ \' F  o- I) a* K                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
! N. d; A3 s. I. U* c9 d

( L$ I. G- f- ?! F0 d/ x                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
$ I( D2 ^. }, H6 P+ H2 C0 b' r; I
* f' a1 G/ k. ^: E
                               
登录/注册后可看大图
        //获得第一个Person节点。% ~$ p2 y1 R8 q& I9 t  i

1 ^$ m" J+ X9 ]: D$ E& Q" j                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();& g/ V5 R$ G% o& J: R8 N
" |  ~2 w7 f) a7 h7 U2 s, }
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
) p) z1 }# G& f3 }2 b

; v" U0 x. P/ j/ A) I  O                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();2 ]" |" }% l$ H& i  a; A% z
9 M* k/ x/ A8 E* c- ]" S0 z: k
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();, ?; o# r  C1 j; o
2 i6 Z( R  {( f( _! H4 w
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
( V5 c8 g$ ^# o& J6 m
1 V$ {$ {$ S9 r" H. f- _* k3 t
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。& m, ^8 m7 l2 u( }3 z2 k) e

, w% G8 |7 J, G5 Q) ?- N$ `                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
. f( i2 z7 p1 r# `; _% B

$ k) A  m/ @" E" r8 ~                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
; e1 r- y! k  P0 K$ U1 X

% z. T2 h& Z5 T9 [( [                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
' \) r) V1 e% i" S! h
  Z6 F+ `' N3 m+ l3 k
                               
登录/注册后可看大图
    }8 ]6 U" l7 @  R0 d5 e9 ?  E! H; R

) j# j. a: @& P% s( c                               
登录/注册后可看大图
    catch (string& e)/ r, w4 d( b# ], _* K

; ^2 K  h- B$ R2 @- p  t6 _                               
登录/注册后可看大图
    {
- i5 }, l* |3 p$ k0 D
/ A6 g2 I+ R" a! \
                               
登录/注册后可看大图
        return false;
1 A& u/ F6 @8 R2 S1 |2 Q6 u0 o  k- p

* N( B- t$ ~) S                               
登录/注册后可看大图
    }
8 F8 v' [2 O8 w/ g4 x& i. [

" q) d$ G9 E3 L                               
登录/注册后可看大图
    return true;
- ]& I4 p& x6 t+ u
5 v" a9 {3 S1 {7 c
                               
登录/注册后可看大图
}
, r( e9 y7 K0 U- u

/ ^7 |3 U& c% C/ d5 b. G                               
登录/注册后可看大图
int main()+ D( ^1 j& g/ q$ F- U5 L9 _9 q& d
9 R/ O' E6 O2 z$ V# G
                               
登录/注册后可看大图
{
6 V7 G: K% X' I/ e2 |; K/ m

! v3 z" Q( I0 R5 y) w  d                               
登录/注册后可看大图
    string fileName = "info.xml";
: Z& g. a6 T% W- @8 ]# G  k

. o$ V+ v& c. A. z! g3 [" W                               
登录/注册后可看大图
    CreateXmlFile(fileName);
$ M8 U6 @- y+ R& z; K7 U  R( a

& s" a2 ?# A% o! r+ ]: @                               
登录/注册后可看大图
    ReadXmlFile(fileName);
3 _: J2 |% O2 `  E3 v
8 m& U2 n# p" i2 r
                               
登录/注册后可看大图
}
6 i( J; R" q9 ^) `2 X% g
' M1 g* o3 U; H  ^
                               
登录/注册后可看大图

2 E' D/ {5 ~8 d; g( C3 h5 t( _4 X) ]- Z, w9 A
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  * B3 I# ~( |0 x* 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二次开发专题模块培训报名开始啦

    我知道了