PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

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

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

[复制链接]

2015-1-29 19:28:56 4325 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片段:
0 }# p2 X. A8 O. m4 Y
$ e# A6 X9 _5 Y  d  [% t
                               
登录/注册后可看大图
   <Persons>
8 F) M6 [2 b2 p5 \6 p- G8 f

) R$ Y. T5 I& ?* Y1 _$ U! _7 F7 w                               
登录/注册后可看大图
        <Person ID="1">5 s3 o' J- p% Y0 R  z$ n* J
& d, E& L  C/ _: n2 ~, C. H
                               
登录/注册后可看大图
            <name>周星星</name>  q0 z9 s* p8 r( m! Q
  V7 o5 f5 X0 R  a0 b1 x
                               
登录/注册后可看大图
            <age>20</age>, C& A, d& j' A1 d0 {2 @

% C+ K7 ]9 u5 n* e9 I* x                               
登录/注册后可看大图
        </Person>, _7 h" T8 c$ Y

* y5 u  r, {! s( P/ [$ E) |                               
登录/注册后可看大图
        <Person ID="2">6 p4 l3 h& m6 h8 ^6 t# V3 X
( ~4 l& G8 o+ `; |8 h/ n
                               
登录/注册后可看大图
            <name>白晶晶</name>
- \/ G4 v: [! ]* {5 q
8 g2 L: Y7 \( h; l0 G0 I7 g
                               
登录/注册后可看大图
            <age>18</age>' ^0 I8 G. ^8 ?: y* M
* X+ p) L. P, u: n: q% M
                               
登录/注册后可看大图
        </Person>
: j( T  H% s/ t9 }0 J

! `8 e- u1 n( n! t                               
登录/注册后可看大图
    </Persons>
5 K9 @/ [" G  i' A, g7 M
6 `) p- Q- t. K8 c- a5 z* ~" r
                               
登录/注册后可看大图
; Z  N: Q5 W& u5 z% 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文件:) r6 t$ M4 a& C) v+ h% u, O; @8 N# d

, S( A) g: W# G# ^& E* d+ B3 W" N9 w2 J                               
登录/注册后可看大图
<Persons>( _2 S2 |" j8 k) V7 }+ n
6 ^+ G% P  N0 v! V+ J. R  [
                               
登录/注册后可看大图
    <Person ID="1">
: Z/ ?: Z1 l5 N) \4 |( s
( |# K! F* {( L# N  h: L
                               
登录/注册后可看大图
        <name>phinecos</name>+ \7 a/ P# p0 y- u0 B7 H) g  M

- _5 u1 d- r5 s, W1 o                               
登录/注册后可看大图
        <age>22</age>
" D/ U8 {" A- f1 k

+ V9 z$ H& v1 M% u. W                               
登录/注册后可看大图
    </Person>- |$ s1 r7 m; Z. ~( R! ]: f  }

, h) i0 f( i7 h, [0 T                               
登录/注册后可看大图
</Persons>
- o( g5 H+ E9 H7 G

* n0 _* A7 H; E" H6 E                               
登录/注册后可看大图
' j2 N9 A& n3 F& _" s
读写XML文件的程序代码:8 C4 b4 b7 K+ m9 }  h" `

& F- l$ G2 ^& D) |                               
登录/注册后可看大图
#include <iostream>9 u4 G5 J, |7 _( a9 M9 t

' H7 y! p6 i4 C$ Z! Y. ]                               
登录/注册后可看大图
#include "tinyxml.h"
4 u6 X$ Q+ m; p- w* P
/ X: f1 p# z- p1 n
                               
登录/注册后可看大图
#include "tinystr.h"0 s! [0 b5 i0 V8 u. M. S9 n' E

5 ]) f; p( a2 S9 B                               
登录/注册后可看大图
#include <string>
- f8 }5 [3 t9 h% h; ]+ e

+ L" U# @/ f% e' o                               
登录/注册后可看大图
#include <windows.h>
6 s7 B: V- X8 ^% z# N

) Y5 {8 Y! r0 F; b. P+ h                               
登录/注册后可看大图
#include <atlstr.h>
3 b: B1 h1 Z2 e- O  [  i

& N  A! X# H; Y, U# W" i                               
登录/注册后可看大图
using namespace std;0 }7 @3 x9 l- Q6 F2 J! T

* g. s0 @% O' i6 q5 ?) ]# a4 Y$ x                               
登录/注册后可看大图

: ?1 Z: \* w7 f1 H

% @8 i7 K' H" y4 w                               
登录/注册后可看大图
CString GetAppPath()! h5 d3 w3 F) W: `5 R% N3 A

1 ^5 C) R3 o, s# y& L' b, T: Y7 |                               
登录/注册后可看大图
{//获取应用程序根目录! c( g) E# v8 ?/ m7 u) w! ^- x, d
7 C3 Q. ^8 d& ^* i$ [/ C
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
3 g, i: N# K. t& W  c

  l( E6 l8 r# f- B* }                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
8 q4 P! f# Z! a9 j6 H
* U4 d- {% q& B- t0 C7 x) v, C# j
                               
登录/注册后可看大图
    CString strModulePath(modulePath);8 `1 L( z7 w. n2 @% \0 `% G
$ m. L( J; B& ]* W( n+ Y0 J* e
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
1 ~3 N. i, i2 N- C& ^9 A  z
$ ~' V- o8 m. Y( r; ~
                               
登录/注册后可看大图
    return strModulePath;4 B  F- |6 N; c; p  A- [

2 k, e( m8 x, f! K) M7 Z                               
登录/注册后可看大图
}; I; _2 ]" `" P6 l

+ ], J- l% e- s                               
登录/注册后可看大图
2 ]2 t' E5 ]7 i" v, a
$ E# \9 w  H, `* K4 \
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)9 X+ b0 q& o) r3 j2 C; f, K

  g1 }7 G+ d7 u2 E& ?                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
4 ^+ }: Q' H/ r

5 h8 Q7 g% J8 m3 N, H9 [                               
登录/注册后可看大图
    try
- Q& D- d+ D7 m* }. p) x  g

8 `. `$ T4 m4 t- ]/ b  Z. A& E                               
登录/注册后可看大图
    {' Q* L6 @% ^# K9 N% k
7 y  K% A, R3 Q6 o
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
  y9 \8 f4 k, G% d+ R
0 f! E3 X0 C/ Q
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();4 ?" \( c! x. X# g2 C
' l  e% _5 |3 B$ I/ E4 @
                               
登录/注册后可看大图
        //创建一个根元素并连接。4 z6 F5 z5 F) E3 S# c4 p

. |: H; f& j6 X" A* f* q                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");9 M( ^# A# S3 v% m2 n$ J
; v: r6 \: J7 W8 |$ a0 @3 Q
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
4 i4 \2 a" I4 Y# I/ M! I& Y

7 q; s+ k( ~2 o4 Y& F                               
登录/注册后可看大图
        //创建一个Person元素并连接。4 U! Q% Z9 _+ ]5 _! ^4 J. A

9 h* J6 R/ B6 l* e6 t1 ?                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");5 O" @2 O; d9 ~+ y6 W

; N; A' O$ O, x7 H$ v9 ?                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);. Y0 s" K" ?0 w. t4 \3 R+ ^; u/ |
3 e4 P$ |' o3 I. p9 |
                               
登录/注册后可看大图
        //设置Person元素的属性。- m/ W4 D5 g" Q

6 f6 ~5 u7 c3 ]4 Z                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");* W3 ^) f! O- k4 N6 e) T

; m* X, Y$ c/ f- x* l2 D+ x* A                               
登录/注册后可看大图
        //创建name元素、age元素并连接。: ~& i' U. o8 p0 ~/ U
/ h+ \+ q0 q- l
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");; E# T: \! i; {8 v) I" M

' D1 W% d( d: T0 W; s: N+ F                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
' e9 g* |6 x8 z" N
% b- s, P2 Q; c
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
  U/ _0 m  w+ M' v) V2 Z

$ }8 g. f. T! B0 }1 |; c2 ?                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);: L% _1 L1 |2 ^
3 t$ E) ^* [: I! y3 ^; z. x# I
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。  w. y* H; ?" M/ l
$ s9 m' E( j  u/ t
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
+ K: q$ r. A* v" i* r5 o1 w
. u; x! k( K$ Y# @
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
& y3 J3 K3 K6 Z6 t7 }! z4 J
5 B$ W# g4 m) f* d8 i- n5 H" A! R
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);; P' `' H3 l7 _; D9 I

2 o3 h% G# Z) |1 C) n; h6 B                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);  C9 a0 |; \$ j6 ?$ @
% k$ h! Y: I9 N
                               
登录/注册后可看大图
        CString appPath = GetAppPath();  a( [; w" W, [/ n3 w

" N# N; E0 V  f5 a- j3 U9 ?2 f                               
登录/注册后可看大图
        string seperator = "\\";
% I1 q7 M# W5 L2 F! L% `! J" q

, I3 u0 P* Q' V; E% H+ }                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;( R) Q( q+ G+ L' n3 b

3 ^; P( j) B: a7 F& I( @, U* C7 K                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件4 _) r$ y$ i, M6 t) H( u5 A) d1 ?( r
1 A2 I2 Q; e" T  i/ e/ f% L* {
                               
登录/注册后可看大图
    }
% z: I% n8 r( z8 s% J
0 [/ T% |7 C9 \3 O! x# v
                               
登录/注册后可看大图
    catch (string& e)
+ j7 m9 w( n. I/ d! T

& D  r0 ]& d$ d) B                               
登录/注册后可看大图
    {
3 t; E2 Y8 ^9 y& p7 d

2 J8 Z1 f/ `: k+ S$ m* H6 z% m# g/ z                               
登录/注册后可看大图
        return false;: }+ m/ H8 c' D
# r6 Q1 i5 x5 T, V
                               
登录/注册后可看大图
    }
: m1 Y! n' S' _8 M2 v5 j
9 J% {$ g0 W' k7 P
                               
登录/注册后可看大图
    return true;9 `3 T& O2 w% C/ L

& S2 T" a: ]1 J( {2 M# B                               
登录/注册后可看大图
}0 x: n- V" i2 B, ], b* f$ c  y
# R% M/ ~- x6 ^2 g2 Z9 ~
                               
登录/注册后可看大图

4 J4 N5 p; V5 p

2 \8 B! n2 e6 d/ c$ E1 ?                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)6 ~* `. j5 ]/ ^/ G& N  H! y

, o  K# T( w$ ^                               
登录/注册后可看大图
{//读取Xml文件,并遍历
4 t% J3 h5 r$ w; _+ u: H) w) G

% ^" U3 d0 b+ i9 q/ b0 w                               
登录/注册后可看大图
    try3 M9 j0 `. |/ Z3 j
2 q( F% |6 x$ G5 M
                               
登录/注册后可看大图
    {
  v$ b+ P1 w% @6 k" c4 X. J
, e: a2 O$ C. u( g- m
                               
登录/注册后可看大图
        CString appPath = GetAppPath();/ e& P+ A/ I- h+ w" s% ?4 P

$ |- W0 b. \* M                               
登录/注册后可看大图
        string seperator = "\\";/ K3 V9 q" f! f

, U) y! u& X" f1 T- Y- X% z1 p% Z                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
1 X9 q5 W) h, R# F  S

6 {6 R3 d! d5 d8 S$ R                               
登录/注册后可看大图
        //创建一个XML的文档对象。
9 W, m+ _, J" w
$ e/ P: u; G: |2 J, P* F5 G6 U( V
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
5 ^2 D0 u, I" N% I1 ]9 O+ s
& \- H% t% I/ Z; h
                               
登录/注册后可看大图
        myDocument->LoadFile();
+ F0 X# y. ?" M1 P; U

6 `5 O$ z! N4 u$ n! C                               
登录/注册后可看大图
        //获得根元素,即Persons。) v: N0 z7 Y8 S& c8 D( v8 _$ b5 @5 O: ]
0 h& ~2 F) E" b
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
) l$ E$ a% n* a+ a% k1 B
* R9 z' j, f) ]- i) w, a( |
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
: |6 S8 |7 G- A6 o0 `" t/ t
3 P- n" ], _3 ^" B) y
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
$ t$ Z' H* d" T( r1 M
8 Q0 [, q6 M6 [3 S0 W' x
                               
登录/注册后可看大图
        //获得第一个Person节点。
5 a% |! z$ l3 e: ^. V& E( ?

% J' ^( \" f. E5 o                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
6 Z8 Q# ?: u; z1 W
! l9 l4 F1 W, b+ }: U) s8 b9 _7 m
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
, E  _9 z; k$ R1 ?) }- i

% f. m3 c8 K4 i" l: z  c8 H                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
8 w. J# r9 F/ ^) K

  v6 u& P8 ?( p: T                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
9 s: d/ c! {% v) P* [

4 o1 O/ P3 P; Z; B                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
% J  K7 q8 g) Y% h1 S6 Z# g
- Q' t3 k6 w4 \/ h
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。$ \. X/ K! t$ j/ r

/ h& H$ e( {4 m' d                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
' M; b2 R! r% g: w

% n- \" F) k9 L                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
4 @0 W. G, [! @- D( P

+ h1 u; t/ M! k$ A% A" w. g                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
7 T. J' Q5 K' H

3 B' Y1 Y5 L  `/ n+ W5 p2 a' T" Y                               
登录/注册后可看大图
    }
, a1 Q% u$ g! B# W3 P

. n7 \3 `7 y5 m+ i2 [                               
登录/注册后可看大图
    catch (string& e)
6 r+ q. g+ P6 w4 T( p: F, r
) h; b# {8 A, [+ y" R9 r
                               
登录/注册后可看大图
    {6 W& ?, M5 Y+ i
6 @. z2 c$ z% o. N" e2 `
                               
登录/注册后可看大图
        return false;
# Q# l* m4 h1 [0 `4 K1 f# k& g
. r* i8 m0 W* _! {% ~. @
                               
登录/注册后可看大图
    }
7 I0 W. l+ x& k8 w6 B, }: e
: ~9 q3 a; D% Q7 F1 ]/ K; ^; y
                               
登录/注册后可看大图
    return true;
% u5 d) F" I1 I8 _- D) ]9 J  q
* |( P: O2 Z5 \. Q/ s* q
                               
登录/注册后可看大图
}
2 w* v. |5 o& Q& S1 z" S

+ T$ Z  G: D2 ~6 P                               
登录/注册后可看大图
int main()
5 T% y, s% o8 x

. [5 y, c5 A! y                               
登录/注册后可看大图
{# M  \# b- ]& n% |+ E8 }
# t% s) m2 W3 J1 |4 ]
                               
登录/注册后可看大图
    string fileName = "info.xml";
+ u) ?+ A" b3 L. U3 h% N

5 L6 n; P& r! E; \9 r0 v                               
登录/注册后可看大图
    CreateXmlFile(fileName);. s" Q) C1 Q, g6 Z4 G1 H

7 N8 @) M9 ], D, l2 \9 Z& `. j/ i                               
登录/注册后可看大图
    ReadXmlFile(fileName);7 p/ t0 X% l! F- N
, [# v! Q6 h  A
                               
登录/注册后可看大图
}
8 l  l1 o' K7 B6 `& V: K3 r# ?" W2 y
4 L- ^' O" p1 ~1 x% K; G4 e. R( H
                               
登录/注册后可看大图
- Q' Z9 x4 {( f# \; T# [! x8 o
' i& Q1 W! j* w- C; j
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
+ h  w; u$ b2 a6 U. I
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了