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 4357 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片段:3 w* E( _  x& c
9 }( N$ c3 h7 M: [# b% W7 g9 n
                               
登录/注册后可看大图
   <Persons>: B) K2 P5 C3 q1 p8 b+ y

2 ?; |+ |$ P1 {1 ~3 s                               
登录/注册后可看大图
        <Person ID="1">
, G% f% w- u0 W( x# ^

; p6 l; K  S& U% I9 D2 w, m/ u9 O                               
登录/注册后可看大图
            <name>周星星</name>
) y' z' k  Q7 e8 T0 l* \; [
6 p* ?2 R; B$ L3 l1 n  ], F% p
                               
登录/注册后可看大图
            <age>20</age>; m( q3 R+ y% l5 z9 A9 M* I
( W( x2 n9 q% ?2 `" S. V
                               
登录/注册后可看大图
        </Person>4 r$ M  e9 c  r' U, F% F
+ b4 r" B8 T/ r6 q0 \4 L/ m
                               
登录/注册后可看大图
        <Person ID="2">+ F2 C* ]; z! Z9 f9 s& B3 Z+ |" k
. o" K9 |& K9 H  ]8 T* r
                               
登录/注册后可看大图
            <name>白晶晶</name>  F6 V4 b* D! ]1 r

3 e$ e9 s, N- \0 c- S9 q9 ^% ~& ?                               
登录/注册后可看大图
            <age>18</age>5 o+ v( N, G% C8 E8 S

% J) g2 `4 v( L# j0 J5 t- v                               
登录/注册后可看大图
        </Person>
) M" F: n& n/ J0 J: O6 q

7 M: h5 m7 Y, M0 J/ o" b; _                               
登录/注册后可看大图
    </Persons>
- c! P( p1 a3 _! l" B+ y
: G- K7 j0 p5 [" j
                               
登录/注册后可看大图
; I/ p) O! o- c$ }: y4 U6 Y
在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文件:- p$ e0 L1 A+ u. D( `4 A, J: O; J0 O

3 m( E& t5 v- O! X) J/ u" j% P7 c                               
登录/注册后可看大图
<Persons>
$ R8 w6 }' P9 C' R% W# g: }
3 D) i$ e: w4 i9 D! d% B
                               
登录/注册后可看大图
    <Person ID="1">% u- P; B9 Q7 Z  B( Q0 L

: e% k3 r, F* K6 V! o                               
登录/注册后可看大图
        <name>phinecos</name>8 }% N  @. E. ?6 B

2 c2 _5 H) Q) U3 Z: A- b9 p! n                               
登录/注册后可看大图
        <age>22</age>' u9 c. v0 S4 j# H2 Z
' R4 r; n# `9 j8 C6 [5 W+ i
                               
登录/注册后可看大图
    </Person>, T, `4 N( m0 Y4 l/ N* J

1 I+ b& p+ B& R2 K3 Z; E- T                               
登录/注册后可看大图
</Persons>
1 U% r! r  J! U1 [. W* H! X
- H+ I( j7 P6 V5 n! r
                               
登录/注册后可看大图

; K# v% g3 @4 D, t+ A: W$ m; U
读写XML文件的程序代码:0 Z$ _$ F  h- ?" D0 b
7 Z& ~# O  e2 i3 B6 m' j
                               
登录/注册后可看大图
#include <iostream>/ v* O% q! W8 M( I. @6 z

0 ?/ z* d  e. A9 [. V' ~                               
登录/注册后可看大图
#include "tinyxml.h"+ {; `. z+ w$ M* B. X# k

* N8 r2 G2 N0 d# I  b% D8 `3 _" p                               
登录/注册后可看大图
#include "tinystr.h"
8 a3 h" ]9 C1 U# W; v; z
3 a0 d1 o3 H% a; p# s4 g; g+ c
                               
登录/注册后可看大图
#include <string>, ^+ f. x: b) P8 U' u) b6 ?* C9 t
1 R% E  w6 M4 b8 w+ D6 F7 W
                               
登录/注册后可看大图
#include <windows.h>
3 x+ [8 R; ^! V+ h
0 {, D. x5 w3 k% L( N
                               
登录/注册后可看大图
#include <atlstr.h>
% z! k, J) W/ f7 l" |

" H' e% N$ m/ B6 r: @; A, f                               
登录/注册后可看大图
using namespace std;
4 `! a. r0 o4 p; O9 q* t4 Z7 H
- n) q2 b0 M! N9 |. E
                               
登录/注册后可看大图

- w: t) ^8 o) l3 J' W7 |2 S1 @

/ Q0 E" p6 C' `  ^) C( N                               
登录/注册后可看大图
CString GetAppPath()
8 F5 l/ e2 [, ]3 V

6 t2 `5 q, {+ X2 x                               
登录/注册后可看大图
{//获取应用程序根目录: Z; g' o& H8 ~( ?4 @% j  D

1 {3 h1 H: [9 X( }: k                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
4 i* j6 a  g' c' }. B! Y
# C+ j/ `7 [4 ?+ ~; Z9 r
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);1 C  ]4 @' o; v( v9 \' G0 u

1 p/ g: l( N: A. D                               
登录/注册后可看大图
    CString strModulePath(modulePath);
  [0 e4 y3 T: k; s' L
8 c8 E1 j# Y4 @2 }) t4 P. N# r
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
5 H8 u9 v6 i( R$ I! u, p" M$ w

& \2 Z4 \, r$ D. s: H                               
登录/注册后可看大图
    return strModulePath;
/ H' A2 a" z1 K3 W/ J
2 {0 P- p  M; j9 x9 b3 y' q
                               
登录/注册后可看大图
}" w. T0 t% N" z8 {9 G2 W
. f( e0 n$ ?% x9 ]3 C. \
                               
登录/注册后可看大图

5 R9 b# l& M3 `9 A" ~, a

$ X8 Z, ]; {1 u! A. h& r: R& R                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)/ C. _  e- t  s; T
, n. ~" D# ~" g6 P8 e9 }
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false" }' e6 H) g. G
7 `0 |8 Y, e" C: I$ j+ h4 O" K5 d% t
                               
登录/注册后可看大图
    try+ W4 u6 f# `3 D8 F3 ^- B; q& }. L7 z

- U( B5 D( y) v  `# U                               
登录/注册后可看大图
    {
" `/ l( \9 k( Y" n+ U2 t2 D

  F/ e- C6 a1 E" m% w: [8 i                               
登录/注册后可看大图
        //创建一个XML的文档对象。' b: A, o8 L4 F4 w1 Z

' f% _) c3 m& u9 p                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
( z' C/ d* I: `6 v

1 {2 Y' r5 A4 J7 `1 K                               
登录/注册后可看大图
        //创建一个根元素并连接。
0 B* N7 m5 ]* V8 d2 R+ b* X

3 V# D! ^" j" h* W: }5 `' [                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");* |9 X5 X0 }- F% a! R+ x7 |
) M! S+ k1 _, K* D' c
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);: b# \2 Q. `6 v2 s+ g5 J9 Q' Q

$ I0 y+ x2 G, R- _% _- r                               
登录/注册后可看大图
        //创建一个Person元素并连接。
4 D5 P8 Q% A& v$ z! |& ^
% ~: l* u8 l: W
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");5 u7 `1 _6 X3 d5 ~

( @2 y# H( h" @& z3 M5 `                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);' I* ^9 o( w/ |5 \; Q

, z5 H1 @" x& R" U                               
登录/注册后可看大图
        //设置Person元素的属性。
3 K- F6 u* Q/ J' F/ R/ s
! u* G  h  D' A
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
8 |! ?+ u& I4 ?0 V. {& c  M7 p
+ L% X4 \4 O) h3 n& h* S0 L: W
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。( o  D4 g, u. ~* _7 e5 ]# c) k

1 f* |  z& \6 b; m. _; ?                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");. \1 k: L& L. @6 ~8 ]# ?2 H

2 G: X' q8 c6 T. X                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");: j( X) V. d6 f

/ S3 E3 |; D+ |! d* t2 U: Y$ j( G                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
4 H- B! W1 x; n9 m/ |8 v5 {5 N0 l

: f/ z$ n0 J4 H1 a3 u% E+ K                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
0 ^- a2 C$ i, ^: Y* J
" q- {- n5 @5 e" c/ ^* ]: i; P& Q
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
8 a. j6 U% [) }

: K2 o: e" {0 _# C5 y; W6 u/ w                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
7 c+ Z) c9 a2 r$ t7 A7 R  _
; Q4 o8 Q7 k7 u, o2 J( k0 ?+ h
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
4 r1 Y( h# Y7 X+ c7 o

' e* P2 q3 o) _/ K4 m; P                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
* I: H6 S. I2 e" R& w* R- z" c, P

7 `# E1 H2 K$ _3 D6 f9 R5 g% g8 J* o                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
2 y5 m$ [  N5 M2 [% A7 ]

  ?! @8 \& K9 X. B9 i                               
登录/注册后可看大图
        CString appPath = GetAppPath();' S  p1 {9 d" T) s6 X! t  T
& u; a3 A1 m! q1 w: W' L
                               
登录/注册后可看大图
        string seperator = "\\";3 r% f# x4 W% W  B. T1 H
4 W7 E. U# ?4 v
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
6 R% D2 A4 x* A9 c

6 f5 \6 P. j) o# D& k, @7 Q+ l                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
& B" D& w* K/ }

, j/ E6 J$ q& F" E& t# y: D                               
登录/注册后可看大图
    }* j- e1 Z1 f  m6 J2 r
2 F5 l. y" I7 P2 w) u
                               
登录/注册后可看大图
    catch (string& e)& V9 |* v( B: M/ [

5 N) _4 G$ b% Q7 T                               
登录/注册后可看大图
    {8 A1 d8 B& t) ~3 J% C. P

" z/ B1 }5 E4 ?                               
登录/注册后可看大图
        return false;
" z( `8 g+ B. R6 [  D/ Y
) X# `& a: c1 I5 W  d
                               
登录/注册后可看大图
    }6 g: ?8 s4 X" R, c) \* p9 k
4 I) _! s7 f1 u+ v
                               
登录/注册后可看大图
    return true;3 y: U5 C% f, g. r

; v" q+ W- r5 W6 q; A* h# c! ~9 c                               
登录/注册后可看大图
}2 s6 Y9 m- Z; b8 o1 f& z
4 h# Y8 l3 I4 x9 o/ F- ?; y8 v
                               
登录/注册后可看大图

& p7 r5 {8 Y' [! L" U) [

$ z' {3 }9 v$ g* r8 |, k' u                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
2 L7 r9 {, p" m/ l2 e. B+ O0 e
* q) H3 w, M" _) q1 S3 A
                               
登录/注册后可看大图
{//读取Xml文件,并遍历1 C: C9 g7 ^( o& G! D( I8 g" @! D3 ]
% z8 p8 e/ k" h9 K, D" E" F
                               
登录/注册后可看大图
    try" v$ ?; f% @+ N3 r

4 z( F6 m% z+ x                               
登录/注册后可看大图
    {
- o' p* x9 L  _$ h. q

, N! g5 F; [$ F2 b* {# |                               
登录/注册后可看大图
        CString appPath = GetAppPath();
0 M" e0 s7 {4 L- I# o! O

7 J2 S; o# O% N$ ^4 F0 ^+ l" t9 A                               
登录/注册后可看大图
        string seperator = "\\";$ @# `0 v/ a; |1 j) `
4 w! @, l. b* T0 T: l
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;# \% Q2 O6 A+ J
' D$ \1 p0 s) k' n3 I# C; V' F
                               
登录/注册后可看大图
        //创建一个XML的文档对象。3 b  X: y* T+ F7 h& `+ U' S$ x
& n7 R  ]4 d+ N# ~2 Y
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());0 ?& \$ z6 d7 \* `: g
; B. Z, v% ]6 ?% L3 J
                               
登录/注册后可看大图
        myDocument->LoadFile();4 L! O7 `) a! F* m

  h' ]2 e/ X' T+ t                               
登录/注册后可看大图
        //获得根元素,即Persons。& {6 K: A2 k" W  I; n
3 o* J  e+ H4 l" N5 f' G
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
: Q6 _4 w) |2 Q4 l' v( g
) z( O* ^8 ?  I/ p4 X
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。" v% Q( u0 A8 k% [( l4 [- U

, y/ F! V' E  ]6 c: N                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
! v7 Q. D- M9 c* _' ?

5 w, z! Q. g% D3 i% [! ^: s                               
登录/注册后可看大图
        //获得第一个Person节点。
2 B) U/ l2 m& ]  }' Q
  S* a, B+ y) D, Z
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
# o) O. x# h* p# ]# Y

+ O) t0 r8 x! W" p/ ~/ Y, }                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。& l4 w0 [, v& O- f5 m$ J# i

- l9 B% k: E' Q                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();) s1 C* Y6 I1 F# p9 w+ ?/ s, q: Y
  h0 v: Z' `& \  E
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();* t9 X% U$ L7 L5 r5 F0 j9 x6 z
# u- _& ~( F; B7 k" W
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();( Q2 ?. g+ V. |5 s* E

8 V0 B( E' I0 z! X                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。. h$ q, W. y7 D1 K" v
4 M* ^  s& N* a0 D/ c
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
% @- X( U1 a8 t. c
: i& i' g- u7 Z& w! j! e- {9 Q
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
! M" k, Z  j0 B# J% [; ~* b
" t0 v* V9 W0 `& `
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;& I- \7 r3 p. ^+ D1 L2 h
/ |$ M, w* @+ O2 G
                               
登录/注册后可看大图
    }
3 E& l$ t& r7 R
0 O7 W/ b* A& J2 ?7 T
                               
登录/注册后可看大图
    catch (string& e)
% N- c. o: O8 `
; a) K9 w+ M- _3 h
                               
登录/注册后可看大图
    {  D* B& _/ d, z1 M3 V$ G
6 z6 l0 S" v' C8 ~! d# G
                               
登录/注册后可看大图
        return false;& Y% H( e# a6 |, H

/ @/ `/ F/ m- {8 Y' G2 a                               
登录/注册后可看大图
    }$ m$ n( D; n- R* z
8 W( X5 x* D  Q( R
                               
登录/注册后可看大图
    return true;- g# v$ h+ B$ d* L0 c, A
( I. f. V" |0 o  m# E- g" J
                               
登录/注册后可看大图
}
- d' |; o! }) `- e9 B
( I' y1 x0 g7 E" W- _
                               
登录/注册后可看大图
int main()
( \6 `' p2 i# i5 l3 r8 q

: G6 h" A% ~' J3 `. \4 r4 K8 C                               
登录/注册后可看大图
{: [' W' J) V  @, j
% d/ I/ D: _, y0 z% i7 R3 w
                               
登录/注册后可看大图
    string fileName = "info.xml";
; Z: c5 `4 G. F3 o, y3 t) m

3 m3 q' F5 C. @: J) v5 H! T! N                               
登录/注册后可看大图
    CreateXmlFile(fileName);
2 ^% s  G) l- ?7 l% B( u3 H, n

) |4 F) l8 N* B+ ~                               
登录/注册后可看大图
    ReadXmlFile(fileName);' `- a; Q1 Z8 i3 T- P) v$ i% L
% Q4 n/ T4 m5 I% [" z
                               
登录/注册后可看大图
}/ {# m) c6 k6 T8 A" J
. g1 L5 ?/ M+ e7 s$ L# K  J
                               
登录/注册后可看大图
" t# W% F) L; n: ~( j
1 P+ @, ~% O3 J' ~* f3 e' B
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
. y2 t. F- {( |6 r8 X( `; @( s3 j
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了