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 4339 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片段:
& B% R; ~$ p- d( T# x

9 a  `& b  |$ H. u8 L7 Z                               
登录/注册后可看大图
   <Persons>
3 a* ]4 n, c6 [0 [4 {/ x- G
% S2 a9 W+ L3 B3 f4 q" b7 s5 s
                               
登录/注册后可看大图
        <Person ID="1">
/ d2 l+ B- G% N3 O+ L7 z1 O
* x3 \5 B: t- B8 r- l, Q& v* m
                               
登录/注册后可看大图
            <name>周星星</name>2 m' z- k0 ]: E, a; w
) p$ F  I+ G8 b% J0 h0 U) r
                               
登录/注册后可看大图
            <age>20</age>4 h) O( p) B8 r+ K8 b1 N6 o

, `3 r& `1 X! k( b4 c' f                               
登录/注册后可看大图
        </Person>
! l8 p, w  U( I" G& F$ O

# R% T7 I) b/ h- o; x                               
登录/注册后可看大图
        <Person ID="2">
1 p& y& r: D& r+ r

3 O8 E* L& d( ]) E                               
登录/注册后可看大图
            <name>白晶晶</name>
' V1 }/ ~; s$ m1 V

( C" y- T$ K2 o" i5 @$ G                               
登录/注册后可看大图
            <age>18</age>+ O$ ^1 K& H1 `% C) J) _& _2 n) t
; A4 t/ M1 @( R0 i
                               
登录/注册后可看大图
        </Person>
0 r2 B2 W# t3 f  |

8 m8 R! v5 a3 e& a                               
登录/注册后可看大图
    </Persons>
  k! V: ^: o$ r" d: T+ m  H; q

; ~3 e/ {9 \2 O: {3 H4 L                               
登录/注册后可看大图

. `0 y7 Q1 w3 v
在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文件:3 ?3 d6 K* K0 a+ d7 O
' U* C+ h" L3 A/ t' ]
                               
登录/注册后可看大图
<Persons>9 I$ S1 n  k  I$ W0 C

( z) z2 p$ P& g9 v5 g* v                               
登录/注册后可看大图
    <Person ID="1">
# b/ \& S0 {  L! x! d' r, a" n

6 m% ^& q& s5 C, @$ ?                               
登录/注册后可看大图
        <name>phinecos</name>4 d$ }, e9 c6 q% u' G
$ K' k& m2 O0 u. ^
                               
登录/注册后可看大图
        <age>22</age>
/ h9 K* d# B1 H; G6 E
5 O+ O  F( h0 G" J: a
                               
登录/注册后可看大图
    </Person>
; u/ V1 h. j5 {7 }; g) B9 L0 A8 y
8 P. k$ ^1 i9 Z  j9 c! O
                               
登录/注册后可看大图
</Persons>5 q! F, m, g) _) |: a

' X. [, W7 S( c" V3 r7 x                               
登录/注册后可看大图

! @, i7 X; s6 h
读写XML文件的程序代码:* Q( z: Y) }7 U; s; Y+ F! v

9 F6 e7 R/ W, m                               
登录/注册后可看大图
#include <iostream>
# Y8 J( W4 {' i4 s6 x3 v) a
7 F) ?2 I6 {" f% W9 n6 d
                               
登录/注册后可看大图
#include "tinyxml.h"
8 w4 p0 f6 n0 `% @6 C, Q! N
7 P. g" A( [. |' P3 W
                               
登录/注册后可看大图
#include "tinystr.h": y  V; e3 y2 l( v8 k. V

7 ~4 a5 }: d5 S+ Z0 L                               
登录/注册后可看大图
#include <string>
. G2 S# z4 ~( I7 H

+ l, R3 g' D# b2 ?2 g  K7 y                               
登录/注册后可看大图
#include <windows.h>% I; M! f3 T, I* V5 E3 {. Z* w

& D" F; a5 m' ^4 S% v- Q                               
登录/注册后可看大图
#include <atlstr.h>% p0 S: P6 ?; p$ [5 g4 |
( E) \$ V; t! s: D3 [1 B
                               
登录/注册后可看大图
using namespace std;" |% a) W1 i4 I. S& d  s: V6 |: T7 X
# W3 @: c* j4 ~5 ^( j7 x9 h9 h
                               
登录/注册后可看大图

& _/ U' k$ g* Y/ @

6 @  e2 N% J- J- z8 c! X( ?                               
登录/注册后可看大图
CString GetAppPath()* d$ }1 h5 b8 v

, J  C( Y  M6 L* b  m! }                               
登录/注册后可看大图
{//获取应用程序根目录- s! F* n: x& p2 T/ d% j5 _' Q9 j, B' w/ X
( S1 U+ H2 h- U' b6 U9 u% m6 E+ I- E
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];( p% u4 Q3 N( J
4 J6 |% c2 [+ @# C2 @7 X; U
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
% N8 E$ q- _/ a4 w  P$ l/ @

) ]& z# O6 s1 [5 l$ Y' @% y1 E: S4 L                               
登录/注册后可看大图
    CString strModulePath(modulePath);7 v1 K' X- B+ ~& a( k2 n

. f) A7 k. N" J8 c                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
: q( d& P* M  y7 y) U% B; {

7 d% U, t2 C& O$ i                               
登录/注册后可看大图
    return strModulePath;
3 W; V2 f- l2 `
2 N7 o! B4 ?8 U/ t: l3 m7 C/ s
                               
登录/注册后可看大图
}
0 L" Y( P$ f# x* p- L+ D

% c2 z& ]1 ]9 |# v                               
登录/注册后可看大图

! O* m2 i1 K; ]2 u7 l
6 f, K1 C* {7 \5 z$ S/ I
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
3 Z- q( P& I* [. H- m  Z: s+ x
2 t7 k  I( ~; q
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
6 x/ X6 J; o0 a3 ?7 J

# g' B6 H8 s3 H$ k4 \4 d0 {                               
登录/注册后可看大图
    try
$ f$ x+ J1 @) V! v
0 [4 G9 `( t: g' B+ z5 ]2 V0 x
                               
登录/注册后可看大图
    {
) [0 ]8 a, ^' o% M- ]2 l4 J5 k
& j; {4 }# ]: t$ f7 \* {7 d4 D
                               
登录/注册后可看大图
        //创建一个XML的文档对象。: S( Z/ q9 q1 g

) J0 U1 G  F" A2 o& c3 q                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
: {9 Y' i0 T( W! ^7 B* y
7 I! `+ i* B; Y0 L# g: G6 A
                               
登录/注册后可看大图
        //创建一个根元素并连接。
( p/ m- V  q$ y4 b

& k3 K& h+ m( p2 Z/ O' \                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
& X6 t4 Z( T( |7 P7 n
: |" }3 s+ D# @" U
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
$ y- _1 @: m$ c: w. [5 C# H

# ?, U) p& l2 ~; \  N- K: `) L0 R                               
登录/注册后可看大图
        //创建一个Person元素并连接。; k1 o: e% a& W! E" K9 m9 i

0 T0 ?# [* |; H! n# @  y$ r% K                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
) p( G) s7 L2 l0 K0 B9 {1 v8 T

4 Y# s7 Y0 C0 ]. v) \: H* v2 K                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
+ H# F) j4 C6 c  ?. x8 D9 W

1 {: |2 O) i( B4 U3 U                               
登录/注册后可看大图
        //设置Person元素的属性。: S- z2 ?( B: q6 j
" q$ w. ^+ X. ?5 `8 ^0 W! k6 L* G
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");- J" z7 C5 q' g; Q, E9 y* O
4 N/ `* J# b6 l2 R+ O
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
3 Y0 @- {! c# _5 H# h- N/ x8 M! g

' N1 J" O# g% I2 T6 i                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");" K. k/ S; n, u6 {
' ]  `% i% Z$ n4 f2 a+ W
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
( n% x1 t) \) b5 t

- e& M/ E- d5 ?3 l. G$ D                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);2 J* t6 v! A" K

& A, \+ w+ q8 d* M                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
0 z" w2 m. `; A+ O: N! @9 t& Q: l
6 N- r! l+ ]1 {6 p6 O: v9 t
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。: g  m/ O* B9 P  v1 o; p

% ?% V( v. K: m% [: N+ i  f                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
) i  \- ~" K  V! K8 _1 K

+ I, O+ [" v0 h1 H                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");& K% h( x/ l0 Q0 F4 _" Y- z
4 A1 E$ h8 }- _9 ^
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
$ C$ T+ y& o$ q

8 u1 {4 M0 D7 w' Y+ V                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
, ]" ?! S$ a& H' S
, p* n8 e4 V& H) r" S
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
5 q) ~$ s: Y* j% P- L
. i6 e& \0 p* O  ^* T$ t8 L+ W, C
                               
登录/注册后可看大图
        string seperator = "\\";
! L  q6 m) C8 j+ O

; e4 P; k; g  e4 ~5 {                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
5 C. |" a( S- e$ {

7 V& `( z/ g- |; t0 ^                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
6 ^, O7 A6 f( e0 B7 c' K

3 p; p7 k: C3 O/ w$ S                               
登录/注册后可看大图
    }
0 d: e) o: h' p5 J
* J  A5 P  t/ ~% y# p3 Q2 B
                               
登录/注册后可看大图
    catch (string& e)
: s; N* M; ^1 z6 S' h
( L' X7 {$ Z! w; Y; i( s% A
                               
登录/注册后可看大图
    {
5 K5 }( H1 h! O% ]: a6 {

% }5 ]% c' L' o+ e/ T2 g                               
登录/注册后可看大图
        return false;$ D, J$ L9 p. f+ v. Z7 z. W+ X: ]
' L  M0 A# P) Z( C6 X6 P7 `4 q) b
                               
登录/注册后可看大图
    }  ^$ p9 r- z' P. I. l

- ^3 u5 \/ N! _# [                               
登录/注册后可看大图
    return true;0 e, _. Y5 B* K5 Y/ S8 S& W9 K
7 }5 Q1 t4 G) Z6 `
                               
登录/注册后可看大图
}
" L& E* r& S# U: y2 d+ t
* m7 H* ], @' k5 e
                               
登录/注册后可看大图

7 h7 B, i0 R9 j+ |8 u: [& ^
+ S: x! ]! U$ ]
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)6 }, F$ O$ S  D( I3 G
) \! e1 s% S' ?4 G; c( `# y
                               
登录/注册后可看大图
{//读取Xml文件,并遍历  ^* n" G: z7 m6 y/ M
# J! I3 c* F8 `& r- L, t
                               
登录/注册后可看大图
    try
# ^  h; n; G0 B# [. P8 H
- ^/ G+ L, ?' j+ i: [
                               
登录/注册后可看大图
    {+ x4 S( u1 Y4 h4 k
9 T/ P. c1 c, o6 A3 Q5 P
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
! W, m9 L$ _0 ~0 [

: U8 e) l" s! q) s# F& q# `) Q; B& F1 C                               
登录/注册后可看大图
        string seperator = "\\";
, j! U: X" G# \+ U) B9 v8 H
' g# Q2 ~) q% u* i
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;- M5 }; p3 G' _+ x+ G! c+ s. U
- I5 A, d5 G/ g, g! w: q. I
                               
登录/注册后可看大图
        //创建一个XML的文档对象。5 m& u/ U4 s& X$ Z/ u# i0 x
  R: i; g% ]$ o& ]
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());( K. n: Z. G% W9 N4 u1 `- V4 X- ^& Y' x+ @
7 q7 G5 w2 c( n& r
                               
登录/注册后可看大图
        myDocument->LoadFile();
% L: y! L+ w2 [0 {, w

# d" `7 ?& P! z% Q0 W                               
登录/注册后可看大图
        //获得根元素,即Persons。1 H$ B0 Z& Q' \. y2 F

4 \6 Z# C6 O0 |                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();" S( I- Q2 B3 S" o- ]' C. a
; m! J: K, G' c7 V$ E2 I2 r
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
, i" X) N' R9 g( E/ W; ^0 M; W

2 r5 c" b' U; v2 y# L% x  r2 C                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
3 L3 t5 M* U  w

* c6 O# z4 N. g7 N                               
登录/注册后可看大图
        //获得第一个Person节点。: l# O$ s# T0 C: v

3 g8 V* @. a/ c. s' V                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
) L- ?6 _' S+ ^  s$ O

" |/ T2 p0 N- s                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。3 x' Y, j0 u% \. `( e* P
' j6 z  C# T* D% N% V/ t
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();  a9 Y7 j/ e  g' z. X
3 D2 k( e. g% O
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();6 v  F! q# }$ a0 E7 T+ j
& _! r( u0 Z' H$ x3 T" F
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
3 _3 o/ h, S# S* J$ W8 g
! X" ~. i( B1 b6 l
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
! d5 S8 y; I0 g" p
, e: s% e- s. E- \3 X/ |$ `
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
2 D5 L5 ^* Z! U" U3 q
. R" n/ ?3 q. ~
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;5 e. W) ?; b0 v: h# m

6 }4 _. c3 Y" v) s: H$ v                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
. _. |* Y# G+ x$ l( t/ x8 i
) p% ~( ^6 B. u8 n7 W
                               
登录/注册后可看大图
    }8 L9 Z4 b7 f4 }
% e8 F6 L2 K7 H- m4 d
                               
登录/注册后可看大图
    catch (string& e)
# V. j( A2 ^+ {. l
! T) T: q, ?: {% Z
                               
登录/注册后可看大图
    {$ q8 _" i: ^, W+ }4 M: z: F7 g
" @! J% [7 W! e% u( n
                               
登录/注册后可看大图
        return false;
. d' B. t* }3 X+ C" o6 p

$ |4 p7 C( w; }! ~/ m                               
登录/注册后可看大图
    }. [+ q7 e& u1 S( M1 u$ v

3 C3 H  S& R. @! r- y) x. N2 V                               
登录/注册后可看大图
    return true;
* ?5 }! {* D9 l+ x
3 o7 q) |4 O, S7 G! M# z
                               
登录/注册后可看大图
}3 \& {' f2 P* ?6 u0 p6 c/ F

3 D1 r' p% A. x/ P# `) Y2 M                               
登录/注册后可看大图
int main()
  Q' n; m4 @# c: Z" p) i# t$ V

6 O3 A$ p% W! U, I( A                               
登录/注册后可看大图
{2 D' r0 D& n6 D3 C2 r

1 F; n; N8 W6 P- T, N                               
登录/注册后可看大图
    string fileName = "info.xml";3 Z9 \2 k+ q5 R8 H

8 u& Z5 k9 K( @" d                               
登录/注册后可看大图
    CreateXmlFile(fileName);8 Y  X3 k7 Z/ Q) o' y

9 J' w, e6 [" b$ W6 X4 G5 o                               
登录/注册后可看大图
    ReadXmlFile(fileName);7 {& f) o1 \# o6 Y7 y: e

* @( Z/ E  P$ y( _) e: r  `: B% A                               
登录/注册后可看大图
}( b. r% R8 `+ t/ z2 t2 g$ J

. {' ~: X& T9 L; T3 ?                               
登录/注册后可看大图
2 T2 p' b) A3 G
1 h$ Y4 D# V$ W/ m
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
8 i' T0 M- U! [( H$ ~! X7 h0 C; X
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了