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 4082 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片段:
' P$ \* \6 q; J7 G
. e& [! m1 N) ]9 J! A7 y
                               
登录/注册后可看大图
   <Persons>
9 y+ B' v' J  |* [) H0 Y3 j
* x" N0 V" {5 K8 l1 I6 H/ S& F  \
                               
登录/注册后可看大图
        <Person ID="1">& Z+ w0 J: w% g( b9 K8 c! Q" o0 P

' s7 g& ~: @! f4 V3 M8 z" h/ w                               
登录/注册后可看大图
            <name>周星星</name>4 k3 H8 T' i- m7 ^% o- S( N
( Z$ C' V* k# s1 N
                               
登录/注册后可看大图
            <age>20</age>
2 J% Q6 o. F) ]4 `! A' H

4 G( l, m# Z- m! V: e( q: c                               
登录/注册后可看大图
        </Person>
9 f6 F; q* K  Y* \, w! \

: Q4 D0 X3 g% L/ p9 _                               
登录/注册后可看大图
        <Person ID="2">
* ]1 D0 d0 B. t$ w. t4 h
  t8 ~  _0 L7 Y4 M! d) K
                               
登录/注册后可看大图
            <name>白晶晶</name>" i$ C" |' V8 F
0 I" `! C6 F: d! z
                               
登录/注册后可看大图
            <age>18</age>" O1 T( I3 x9 O' i' x

2 V, E+ a8 N- ]1 C4 [1 e% }- K                               
登录/注册后可看大图
        </Person>
7 V8 n4 n" t7 {
8 p- R/ d! _5 |- V4 e0 \/ h7 s
                               
登录/注册后可看大图
    </Persons>
/ K# V# C8 N4 J+ p9 X

" Y0 q" p  }, p( ?* p                               
登录/注册后可看大图

9 H3 i* W& v4 K' g* s  C
在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文件:
7 J! p7 I, x1 w, y

0 C6 a4 N! @' r+ }1 e                               
登录/注册后可看大图
<Persons>8 R4 x8 D9 P8 @5 n1 X3 i* p, p" J

+ W# u/ ~! \, O  T: K" |# X                               
登录/注册后可看大图
    <Person ID="1">
2 v! u- e6 v) M, C( t6 ]4 }) \  c

' j: e7 `( @) w- L  D7 U                               
登录/注册后可看大图
        <name>phinecos</name>. f) C# M! b' K% P5 }! R
5 |3 u4 \  j/ d* S5 |
                               
登录/注册后可看大图
        <age>22</age>& U* T2 o' |5 v7 ~$ w: s) ]
* x8 d9 }% P, }; J  N! z0 C+ b
                               
登录/注册后可看大图
    </Person>
3 G. N! {( {% c
; `! _+ ], p& p9 Z2 s" q% }+ G0 G' ?
                               
登录/注册后可看大图
</Persons>
! G' E0 [7 C( t/ a1 G- \2 E! a
! g4 U9 k' O' q3 Y, _4 {
                               
登录/注册后可看大图
7 @  ^! c8 m( ?; m
读写XML文件的程序代码:8 y; \5 ]+ J0 U+ w0 b
9 R9 k8 K* h2 T/ O0 v" u
                               
登录/注册后可看大图
#include <iostream>
: i  J, ]7 W& i

( Y% A9 E/ Y. v4 U8 d! C! E- E8 I                               
登录/注册后可看大图
#include "tinyxml.h"
1 F! e4 ^  c% z3 h' Q
% u1 v' ?$ a" _( S7 |! P
                               
登录/注册后可看大图
#include "tinystr.h"( \7 g, y) T% R/ C
. o$ O* ^* T* _( [3 }
                               
登录/注册后可看大图
#include <string>' |1 C! d* W3 U* F# F

) L( {  p+ h  u- X6 J# c* ]                               
登录/注册后可看大图
#include <windows.h>
: I/ l; ~0 f) a7 Q% ~% V" x% W
1 t; c8 e5 \: H8 y1 h  k: F% G2 N$ X
                               
登录/注册后可看大图
#include <atlstr.h>
1 h8 e6 e. H, a' L  k
% k% q0 x2 E( J0 E
                               
登录/注册后可看大图
using namespace std;5 y; d: ?( O' k- X

7 W* A- E& C8 {0 k                               
登录/注册后可看大图
  e7 k6 H" d- W) Z* o
& f0 x; j+ D" ~0 c0 |* q, R
                               
登录/注册后可看大图
CString GetAppPath()
3 A  p+ v" B+ w5 k* W. t

6 ~9 j" @1 l" X                               
登录/注册后可看大图
{//获取应用程序根目录/ t  r0 Q& w0 Q8 m1 X4 ~$ G
% H8 v0 T; B8 m4 r3 j
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];/ I, S8 F* y, F# R# g1 t, x

$ x# _5 o! W$ b% l                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
! s/ d7 ^) I/ o1 V8 Z' R$ _7 w9 t

* Q9 E) @; _9 t                               
登录/注册后可看大图
    CString strModulePath(modulePath);9 y& D2 q; }& `5 \2 |2 x) M
4 s# z$ s, b3 U! X* o3 l: l1 T# _
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));* @3 C0 R3 A% x& J) g
1 o3 ]# q* J9 D  z
                               
登录/注册后可看大图
    return strModulePath;
/ [- z: ~) ~+ w2 l+ h
5 B5 N( R" @! {" Z- o' y# S" v, z
                               
登录/注册后可看大图
}
% u! h( ~! T8 }; P# p. l) y

# W: A) V" ~! e+ |                               
登录/注册后可看大图
  k7 j' E7 G% q/ r
/ }" U! _! y# d. P6 Z. O) k4 K: y
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)$ j! A& G6 n& ?2 q
' G$ J* D; J: b8 \9 |
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false, p+ ?" d, Y4 E' D% a7 e; ~
, p# D8 I9 J4 g2 e& ]
                               
登录/注册后可看大图
    try
8 ^" J* A! S# [8 v! m$ F' d( p2 d# r- h

& d! ^$ b3 f' o3 p4 Y" D8 u1 g                               
登录/注册后可看大图
    {5 W& k; P; z8 p. n! q* s0 u

  l$ u4 T) e. }( S. Z! `5 _, a                               
登录/注册后可看大图
        //创建一个XML的文档对象。0 U1 G% K/ ^/ @

8 t' E" p# m  F2 m3 X( M7 r5 C- t                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
" \& X2 v' T: z) [: V& j" c  ]1 L

2 ]1 U. m1 W4 q3 Q) R                               
登录/注册后可看大图
        //创建一个根元素并连接。8 r6 Z% q( l, i8 a' q! r
( S% S5 l: n# F- M6 C0 }# |
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
8 L  @3 V$ p/ `6 T
9 y  Q- f7 u7 S$ p6 F- ~9 d8 x; s
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
7 _0 O6 H% `8 J8 l! t5 Q

' L4 g& A1 C7 |' `2 q4 Y7 J                               
登录/注册后可看大图
        //创建一个Person元素并连接。
6 H: k5 H$ f- u% f5 N" l
1 e/ s4 k' w) S( L
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");5 r- e' {- p0 p$ G9 o) V" n( F% q

# |5 W: Z. e" C* c, v                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
) i) {  b3 }. C5 i0 ?
( |. Q6 i4 T+ ~5 ]& }
                               
登录/注册后可看大图
        //设置Person元素的属性。
4 a  {9 w6 I1 B: x# W. B

& l+ j9 ], c' r  ~' D                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");  }2 r! T" V& ]. P5 p5 r
: C. D8 P7 B( c2 v$ x
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
8 O+ v, `/ U3 _8 F8 v& D
! g3 \2 P3 l" t& H; M: ^: |* Z6 Q
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");5 u7 ~; w, z" G! ?8 Z
; K2 N: L5 C* ?- [4 D1 a
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");" f/ _8 p& g0 g3 A/ P1 k6 N

2 n! }! o6 p+ E6 v                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
: X5 Z3 {! `, q7 v; {
) E' O3 T) v" n) d' ^: s
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
% N7 C5 R& n$ p

6 F7 l: U  n5 {4 p0 Y                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。' j! H) V3 e( o% @9 K5 `

' v5 O$ |. \% x" U$ Q3 C+ P                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");/ L. s3 I) {% a( a7 c$ W( c$ a
2 K: Z( {# M: x" `5 T( |  ~
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");/ o3 h: U8 W- n, K& V% X% K$ F4 p) G
8 z* X/ i& q" a7 z: h. [* z
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);$ y2 z! K' c5 ]" h, g' f; }% ^( ]
* a$ S9 k9 U* C, C! T) q2 [1 i5 k
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);  F) i+ A  W* y, n
) V6 H. J) ^, y+ g/ ?3 D5 l
                               
登录/注册后可看大图
        CString appPath = GetAppPath();, q4 z+ m; q7 f9 A3 r* C' S
! r0 a4 G8 P% N
                               
登录/注册后可看大图
        string seperator = "\\";
, U; q' a+ [" w: o) K* I

8 _/ l0 n; f& p0 F/ \                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
1 Q" H; u# Q, j! W. \- y

) M  z6 Z" Q1 L2 p4 f' R                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件( [8 V0 ~( h# `" ~

7 W6 j) E- `8 l" p                               
登录/注册后可看大图
    }' m7 i+ z' h0 \& |( o+ J- m
0 I( T* N- M& C0 r* ]) X( x$ d
                               
登录/注册后可看大图
    catch (string& e)/ Z$ w* {. [2 n9 r
, r2 c% I. w1 x! o
                               
登录/注册后可看大图
    {
" D" R5 x6 q2 {: A- o- R& `1 N

, a% C: ?. v2 N; q9 s8 M                               
登录/注册后可看大图
        return false;  q1 r) J# m3 K  v7 g9 c3 Y

/ G. N/ l7 q9 Q" ]                               
登录/注册后可看大图
    }
" \( L% z2 ~3 k/ O( p

  P8 p- T7 W7 x0 J( g' M$ T                               
登录/注册后可看大图
    return true;/ ]. g8 N" d0 @' U4 Y" ?4 N

) ~  G" d4 K4 V  v* X$ l. a7 t) V                               
登录/注册后可看大图
}
/ a- y& K' z, [3 H0 U2 \

( S$ S7 E0 P2 H: W9 w* i! Y: b' l6 ^                               
登录/注册后可看大图
2 Q5 v2 n4 u9 S4 P; G+ f

4 {2 `! T" _: V& _' ~                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
% N: i6 l. ]* m& X2 E

4 d4 s3 V3 e$ a5 B# e" ]                               
登录/注册后可看大图
{//读取Xml文件,并遍历
) j, ]; X# f3 e5 h) m

$ C  ~& k& b* F0 B                               
登录/注册后可看大图
    try
, g# r/ v  n$ A, m
2 K7 ^/ F" h0 {
                               
登录/注册后可看大图
    {
" V0 r& ?& B. @8 t6 Q: N2 L& Z$ f2 z
# P+ y9 j. F# c0 P  T
                               
登录/注册后可看大图
        CString appPath = GetAppPath();2 {$ t6 a5 i( |0 I
8 c  H' {' D1 L" S6 _2 T
                               
登录/注册后可看大图
        string seperator = "\\";
0 \5 G, l4 R& [' G

3 e! @" r- P& A                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;+ I( f8 n# ~9 q/ g2 a( V

0 ^) d* v' i  {7 F2 E                               
登录/注册后可看大图
        //创建一个XML的文档对象。
0 |, F) Z/ j- k* a& W6 o1 t

! k  |" e/ o) O* D! x7 Q1 N4 g                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
- w- H0 ^/ D4 i$ Q+ ?4 D5 V; P

& c, F6 X$ I+ E$ [7 M* Z                               
登录/注册后可看大图
        myDocument->LoadFile();
; m/ S! M& c6 |+ n, T3 \

) T+ H3 U/ F3 [" p+ `                               
登录/注册后可看大图
        //获得根元素,即Persons。( T& n3 C4 v2 Z  x; s
; ]3 a6 P: R, ^5 ~" S  t
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
# _9 T3 w" J, g
& R, w2 t* Y' z4 S0 A
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。* O+ U! E, d2 b) n/ \- \
! M* {( Y* V/ ~" z0 @
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
9 p0 ~% k+ o/ S

+ Y# N8 W8 R1 U. X/ {7 J# ?- Z7 |                               
登录/注册后可看大图
        //获得第一个Person节点。+ d' s& {& Z& h+ z+ |' q

2 B! `/ R1 G- r6 F( r! Q2 n, k9 I                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();9 Z5 k- A+ O! h/ Q& Q
: L6 T( V+ S4 q) Z
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。8 }% Q- g# |9 T" H! l( D8 ~, b

! t! u! @3 A7 F* r! F2 L* D                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
) C' O/ \& w7 S1 A; M$ @0 h

, z& i- ~! [  P( v                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();. y6 y" r; v- E0 x- y$ x0 d

" w& a" V4 ], |( x5 s+ o                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
; `7 \3 v5 g# Y
- O0 e4 v0 G' ~; Q8 w' u( S
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
% ~$ \) a4 r, J" X/ K

$ h+ K' L4 F" C) r, m                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
* P& V& G0 J, H" y. `! s9 k- J+ o
2 N+ L/ D4 q/ g' ^
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;2 c9 ]+ U2 e' z, c. m

8 L# S/ x0 ^0 u; l4 z! o; e                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
+ o8 x# f' a+ z. o+ p

8 w6 D" e& p4 V% r1 f# I                               
登录/注册后可看大图
    }$ |; I3 T7 W9 z( X
1 f* @% x6 P0 r) I5 p
                               
登录/注册后可看大图
    catch (string& e)! U1 S4 y  E0 \* i4 W

/ S/ @6 A9 b% `) g) X9 G8 C                               
登录/注册后可看大图
    {* x" f* N* {/ k4 R; @; r0 D) k
! ~! N) a. _4 \& d; a
                               
登录/注册后可看大图
        return false;
! X5 C; ?, Z9 |7 D3 D8 q
0 j$ V$ K# q8 ?# s. O/ p2 R1 }
                               
登录/注册后可看大图
    }
) |& z+ ~" Y0 E- N& c

: \+ d5 z2 A9 E6 M                               
登录/注册后可看大图
    return true;
0 I5 M* [: c5 a1 m0 t4 W

  h1 N- s% G9 r. b                               
登录/注册后可看大图
}& Z- u! a5 V& @* r( f& i0 s% ^
% T0 f$ L, H. c0 k" }  D
                               
登录/注册后可看大图
int main()
) l; C& b1 r8 f

+ u3 I: ]2 [; w& p) M, {                               
登录/注册后可看大图
{0 F1 g( B" e  a* q6 E2 K

1 K7 `; C8 A) y% L' I( s                               
登录/注册后可看大图
    string fileName = "info.xml";5 O/ S9 I; `+ q* Z# l5 t1 X
! @% Z: G+ O+ r4 r$ u! G
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
; E$ ]& c$ Z+ B  A) Q* C
4 F5 c$ {. ~' x- C5 ~9 s& G
                               
登录/注册后可看大图
    ReadXmlFile(fileName);! K! i) w- `. @: d  N0 c

6 P' u, R9 q" \* C% W$ Z                               
登录/注册后可看大图
}" R% w! n1 @, X* `* C) i& ^+ F% t; i

" P7 g% [/ V) Y+ g1 f+ O                               
登录/注册后可看大图

5 `  M" V- o' P$ i1 S5 s- O
- D3 R4 b5 _, E+ {+ |4 O
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  - |9 D; t8 R0 i5 D/ k
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了