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 4310 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片段:: x! ?0 @; @( S; \4 i' y+ w6 s- T
( P" x/ Q# D" Q! m6 l5 @9 y& ~
                               
登录/注册后可看大图
   <Persons>2 v& J  A7 U6 V8 s( s3 c
! R  u! d0 k! |) n" Z; D8 C$ E% ^+ H9 X
                               
登录/注册后可看大图
        <Person ID="1">* ], A0 K9 ~( ^4 h* [% \

. K9 T" `! |+ h& Q                               
登录/注册后可看大图
            <name>周星星</name>
0 I( G1 ]7 t" c5 N3 Q+ b; U: Z7 f/ @

  P/ m) `! Z- Q+ H# G6 z' t% z                               
登录/注册后可看大图
            <age>20</age>7 y) m2 @2 s* f
* _. k' _, D  v/ t! O) @
                               
登录/注册后可看大图
        </Person>
; \; j7 \+ a1 y9 ^4 x
) K0 A! H4 N6 P
                               
登录/注册后可看大图
        <Person ID="2">
! u, l' k2 r6 K0 {

$ u8 n# g& M9 G                               
登录/注册后可看大图
            <name>白晶晶</name>  I! ]; J9 ^! m" e2 m
& ]/ f' B0 e# `0 g' j
                               
登录/注册后可看大图
            <age>18</age>
( `/ O; \" v% I% Y. L

, q2 G5 S8 @8 g8 Z1 k" v$ ^                               
登录/注册后可看大图
        </Person>
5 F/ D3 D+ e$ b4 d' ]

4 d3 t$ a8 W0 |9 W4 V, B                               
登录/注册后可看大图
    </Persons>& H6 K, C+ ?; J! N

3 I+ K* D! j! h/ F! @                               
登录/注册后可看大图
+ b+ h/ Y. \. B6 ^6 L# [
在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文件:  A% ~* l6 R% b, L' b$ J# n1 Z+ E

; o: s+ a; `# a% r$ d' ^                               
登录/注册后可看大图
<Persons>
( T& U8 q6 {8 R5 k; V

% C7 r: n+ }! k5 M3 ^  \                               
登录/注册后可看大图
    <Person ID="1">
  u4 A7 o0 L# k9 L# O* J" f
0 X* r  i& r. e
                               
登录/注册后可看大图
        <name>phinecos</name>
4 `& B" _% j! h

/ v! e+ ]. o% L5 y2 v$ L                               
登录/注册后可看大图
        <age>22</age>
) o2 e5 Y# P1 j5 r: A

) x* o# P0 Q  F; ?9 b2 ?                               
登录/注册后可看大图
    </Person>
& Y' [' U& V1 s
0 X) S: [  r6 ?$ r( A/ l
                               
登录/注册后可看大图
</Persons>
- j# h2 M6 J; R2 i4 }3 n

" L0 G' [4 B' }/ B6 b  y                               
登录/注册后可看大图
  M+ y9 A5 L. j; j% a
读写XML文件的程序代码:8 _$ }$ U; s0 k' p5 {+ T. s
/ Z. ]3 P, H9 Y6 S, T( y
                               
登录/注册后可看大图
#include <iostream>
4 @8 c' u  M0 n& V

! @5 ^/ N  z: E3 ?                               
登录/注册后可看大图
#include "tinyxml.h"
0 o4 D- b& m- g7 `5 ^" ~

; g& H8 }. G# P$ W                               
登录/注册后可看大图
#include "tinystr.h"
' y9 r0 z0 m( ]$ @
$ B3 {2 O8 I$ E
                               
登录/注册后可看大图
#include <string>
' v8 g' t( n+ H0 K+ e
; w8 w) Q7 h) }( L" l
                               
登录/注册后可看大图
#include <windows.h>- [2 J9 N2 X$ B' |$ _

; u9 a- |9 _- G9 _                               
登录/注册后可看大图
#include <atlstr.h>  I( R" R# m4 S- o2 o/ {2 s

# o! j0 A( C" W( `5 |6 Q( C                               
登录/注册后可看大图
using namespace std;( `: z. n- u1 m

$ t" P( ?$ E" C4 Q2 G                               
登录/注册后可看大图
" H2 j( ^" _% t: i. w
. v; e/ P9 i8 x" L4 L; f  Z! l
                               
登录/注册后可看大图
CString GetAppPath()9 [& |( J. d) |+ a
* D  Y# n) b; m9 V4 f; j$ y- Y. R
                               
登录/注册后可看大图
{//获取应用程序根目录
" ]! F8 J1 J3 B1 m

" H: t9 |1 g% t, L) V8 q9 _                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];. F) m# f4 a1 V! o7 _; r4 Y2 g
% z! K9 r' g* c6 p
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);' Q5 p" Q/ V2 y$ n' ]7 X/ ^
5 {5 ~& C7 X" c  ~& O
                               
登录/注册后可看大图
    CString strModulePath(modulePath);) a) m* a1 B1 _8 B5 R: b
- ]+ B/ ~7 j9 Z
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));4 J7 [$ F5 [7 l7 G3 C+ x

/ n; f3 s. L8 t) h" d4 k" n                               
登录/注册后可看大图
    return strModulePath;: I; N7 x- V9 i4 s
9 C, N/ Z) n( s' ~
                               
登录/注册后可看大图
}) f# `# y, b, ^9 A* i! T5 a! R

0 }, Q3 ?( U8 q  }3 g8 P                               
登录/注册后可看大图

) {7 u* ?: U* W. f9 J3 }
; d' L6 {. r$ V' U7 r/ W: q+ X; m  @
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
* a+ M  u/ K4 \& K" J( L* p

) [0 I1 H0 L% `                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false0 V( s1 {/ f5 D* N5 y: v

# p) e( E7 ~, j2 ^                               
登录/注册后可看大图
    try3 Q8 X9 c( H; u2 r

- H5 `: ?# p+ }- K                               
登录/注册后可看大图
    {7 m, y4 v, y5 _' O0 b2 }

4 ^6 ?) |: n2 S  _3 B/ J0 ?) a                               
登录/注册后可看大图
        //创建一个XML的文档对象。
; t  S# |% Y) M$ {/ `1 V
3 f% P3 p0 l( f- @" U, w" u
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
( U1 s2 M1 n$ `+ J. x# ~! e( z+ u/ R
; b7 R- o5 q- }  Z* K  @- H, _
                               
登录/注册后可看大图
        //创建一个根元素并连接。- G* g) j7 h+ n# X: q0 V# M- D

  o: `3 u; k* J7 X                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");& j: q& E  i0 O. H  o( _, r- H! @
1 x. \$ g% }- p' E+ w- W/ k! ~7 g
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
5 m% L4 d) G  [+ D, L

+ d4 c, j9 e0 t* c                               
登录/注册后可看大图
        //创建一个Person元素并连接。
+ N. C8 P, w* E. u. _1 @
; |0 w3 e* H+ e$ k! a, U* X5 }
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");2 m9 O9 M; r' j' _& ?! e

, h7 q3 u: N% e+ u$ N                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);3 N) e: U/ y2 j
5 U3 p+ A3 E  L" R* m$ k  z: n0 [
                               
登录/注册后可看大图
        //设置Person元素的属性。
. j+ B% S& r+ A6 r
9 G+ v; i. G; y: m, |1 c
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
8 [4 Y7 M; i5 `6 m
  E9 x, x) h+ `
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
6 T/ u+ Y( O" h" c2 }9 o' m

7 O8 N% {9 n. r  |                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
+ c) M  l' f7 s$ e( N) V
/ x) B" b& w2 q# ^" e3 W
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
6 z* x; _' H; R2 z2 U( v' O* L! b
  I% X  F1 B$ Y6 N! s2 X
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);. x  _4 q3 s8 z% i
1 _/ n' v7 F5 l+ j+ m+ H+ K  c+ `
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);; }0 u4 r( d/ W; w" g
3 I* [: X- h' z  Y7 ?5 \" P
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
  ?2 f1 \+ l! `/ f) ~, y7 h5 ]

( s$ x. V; m  _6 W. _! d7 u# n6 ]                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
6 ^, R. A( d, z2 l: Z) I
$ S* A& X/ t* ~. M0 K4 g0 F
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");0 L: B) c2 p, U, B. U
, S2 f1 P3 ~9 s: T, y
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);/ \) j, P$ H5 J
( H" j7 U' g) z! p4 K' z. W7 f
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
% D8 A6 T9 `% A+ \# {8 h9 W
6 q$ y* p$ v2 k1 H. W
                               
登录/注册后可看大图
        CString appPath = GetAppPath();: W% t" r1 b; C" I# j! a

  z! ?$ o$ ~2 y2 k' c% d; r5 V* x                               
登录/注册后可看大图
        string seperator = "\\";
/ }% m/ }+ {9 t# ^4 \' I
: E* W+ I, q* _% N1 n8 D
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;! j: U0 y% Y  Q" [
" m- a0 j  F( b! i$ N; X9 S' Z
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件0 U$ n" m9 r7 z# \

# s7 L: v) i% n5 Y% g                               
登录/注册后可看大图
    }
  \+ }) w" d, g# t  B/ y" ]

" [  g) }, l- v/ @. Y, f" o                               
登录/注册后可看大图
    catch (string& e)
- g7 X& i+ v+ D, l6 u
9 h+ i! Z- e5 A3 R  F: s
                               
登录/注册后可看大图
    {* p& q5 K% M0 d5 p
  E; H+ s; i9 Q! A9 \* s! p
                               
登录/注册后可看大图
        return false;
  h1 |& g6 ?2 T6 N
5 h& |: g+ A+ O8 c1 ^# k+ d" M3 J: y
                               
登录/注册后可看大图
    }
9 ~* X! [6 T) ^* F* k
9 p. `2 U2 x5 @! R
                               
登录/注册后可看大图
    return true;
' c" N& E7 q% J
- E8 f! O8 U% \& \* y- a2 U
                               
登录/注册后可看大图
}
7 [/ {1 v- C3 J6 H

& x' D7 e/ Y$ R) W: w& I- @( u                               
登录/注册后可看大图

& @! m% m) c8 t7 c

5 `& i# n/ n( E; v( A                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
6 u. `; y% |" O4 O

6 c* C/ ^  N# |/ m6 g! P+ L                               
登录/注册后可看大图
{//读取Xml文件,并遍历
: J0 Z" X' @4 ~  x

) }8 o) _" D  X/ p7 D% ~                               
登录/注册后可看大图
    try; W8 D* h' s# a9 N% m. J

5 n! T5 {# I4 P1 X+ v8 u                               
登录/注册后可看大图
    {* {- _4 o. ~. P8 ~$ D9 }. X
# z$ l2 Z3 m; R, K
                               
登录/注册后可看大图
        CString appPath = GetAppPath();1 |) ^% a7 ?5 W8 j) b% E
. O% d* ?2 m0 T" C, V. t; l
                               
登录/注册后可看大图
        string seperator = "\\";
8 u: N8 j: I7 z: d- N+ D  R
: \( s0 ?, [1 g& v3 h
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
3 K6 n* Y7 c4 L+ p: X3 h
# {' b- B1 K" P9 K. z2 e
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
' Q, p7 x' y: T# V6 @7 r

, p0 C0 l$ j; G- K                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
9 u  V4 ?6 W. f7 t  d! ~: D' G
) B+ q4 h1 o/ u6 i
                               
登录/注册后可看大图
        myDocument->LoadFile();) v& d, @" R7 _
% [7 v. O: T+ l- q6 L
                               
登录/注册后可看大图
        //获得根元素,即Persons。2 @, m: Z) U5 ^9 Q1 h, j: Y" |
+ s  s  @  X: [" ?$ M
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();$ c5 j- Y/ _* C! K* j( F
' v( u. g0 M+ x' X
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。+ B: ^& f4 n2 C+ l
/ i# D. p% E+ x
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;: l, Q& q1 b9 I% C: l, B/ D! \

" V, p" v# Q- _/ V/ K5 y; @3 v                               
登录/注册后可看大图
        //获得第一个Person节点。$ I% P7 ^2 ^- P$ |/ G
/ W$ W( l2 x  y2 C4 k1 @
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();6 q+ r& n8 e9 K5 X8 d$ g8 H7 K/ ^8 u

  J; j* O6 _$ e0 O4 j                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
: H$ V4 q& V; ^

- C: Z4 `) c3 P: B3 f4 k; j                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();, G1 `6 F/ M  s# o; P3 l

$ d5 O7 i% \2 K6 w                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
- M7 Z% b$ [/ @/ ^+ j4 h
8 g$ S2 ?" T: H0 H! Q8 L: N5 b& n/ D
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
; }' x, e9 ]' a" s7 R
0 r4 n! }: ~( J: Z* e
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。2 v5 S& T7 S0 `" x' \- m- j6 o

3 i9 o- r! R4 C% d2 Q                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
. E# q% W  i9 O# }

: Q' g' L$ l  X) G  a                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;  M5 ^9 ^, j9 r

3 S# n1 b; U/ Y% h- ~" m3 S                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;! ?( Q7 ?6 u. ^& N  f$ e
& O: ]+ _: S* }# j  k
                               
登录/注册后可看大图
    }( N; ~9 t6 _* V0 S! O

9 e+ M% t. |' l2 N* |. x6 _                               
登录/注册后可看大图
    catch (string& e)
1 V+ `7 {: f) H, y; J* E# i% O
/ P7 t0 o6 L6 j
                               
登录/注册后可看大图
    {
' j: B+ ~+ D  x% c! Y* E# z+ b: r/ Q: ~

0 Q+ T# w6 s$ l6 t                               
登录/注册后可看大图
        return false;
! W$ `( X3 }' n& y5 W
! e7 i" p/ o* m
                               
登录/注册后可看大图
    }# L" {3 G5 Z2 `# X0 H/ _! _2 n+ h8 }
" M' C' m& r. L+ m
                               
登录/注册后可看大图
    return true;
, O7 J: r; q3 p  o$ y

7 [1 ?6 `/ D! k) B! b! |% N6 S% u9 u                               
登录/注册后可看大图
}
# x) X- M6 F$ I, [

& l2 z& l$ q' ?, c, U$ i                               
登录/注册后可看大图
int main()+ A- x, }, Q7 d' z" r
+ v# e# y; B0 ]8 O5 T9 u
                               
登录/注册后可看大图
{; R9 {3 b3 O6 g; L5 H; k) w

5 a0 k6 N& H  i2 i# U9 k& K! ~  y                               
登录/注册后可看大图
    string fileName = "info.xml";. c9 M& B# N" y$ P

* l7 l. E& p; r9 S  l" u% o                               
登录/注册后可看大图
    CreateXmlFile(fileName);
5 o! }* C  Q7 U( ?* c& D- R, E
  O8 N! r  q( f; N, ]. I
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
' f4 R1 |) f" Q; l9 L
+ q# \0 J) a2 H# z
                               
登录/注册后可看大图
}
7 q- `" E& e! i

* A5 c& d, n3 G' C- K1 I                               
登录/注册后可看大图
% I5 k1 k& ]( ]" W4 }$ ]- }

- Q/ {4 ]$ K( x; z& ]( f) J
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

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

    我知道了