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 4296 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片段:. I; M( b( y0 B+ [

5 K( ]1 ?1 X6 o( U                               
登录/注册后可看大图
   <Persons>" o3 D: b# a/ V4 D
7 T/ l! j( T; w0 ]- D
                               
登录/注册后可看大图
        <Person ID="1">) B1 N# B# ~; p% F
. F; q+ Y2 m: s& [0 I' n
                               
登录/注册后可看大图
            <name>周星星</name>" F, D9 O& e! W: Q8 X

5 A( d2 ?9 m; A8 h& d                               
登录/注册后可看大图
            <age>20</age>
8 e. M6 Y8 v# F, u* g
* k" M6 q3 c7 d
                               
登录/注册后可看大图
        </Person>
) |# g6 g$ y/ F9 ?" b
" M% ?6 I; E/ [( {
                               
登录/注册后可看大图
        <Person ID="2">
3 B: @( _5 {1 M. n
) x3 g. s% N! G# N# |' J
                               
登录/注册后可看大图
            <name>白晶晶</name>
6 a6 G4 }" ?$ \" \8 j% p  ]" ?! i. g- s

  q; ~# G; m' |                               
登录/注册后可看大图
            <age>18</age>
% m; j5 a+ K, L& {8 j, M0 D
) d7 w. r$ X7 a- x4 B
                               
登录/注册后可看大图
        </Person># z2 T9 i- I/ h' B: r3 S1 F6 I

4 T5 z' B1 I% a4 b  G) z2 c0 t                               
登录/注册后可看大图
    </Persons>
0 k2 `# X6 p) J2 G
, p0 \# u" i0 V3 p8 B* s; ^
                               
登录/注册后可看大图

' b6 C" z  ], J$ o3 o8 ?
在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文件:( W. P+ S9 n* p: v; h0 s
( M- l, H+ Z$ l- R4 Z. t$ V( [
                               
登录/注册后可看大图
<Persons>) O7 Z" S: G; Z) g3 z  z! z
/ x2 n5 t$ i/ M: F8 E1 l& c
                               
登录/注册后可看大图
    <Person ID="1">, e, N  n, Z/ R* q6 X
( |( i, }! S& W* ~0 X, P
                               
登录/注册后可看大图
        <name>phinecos</name>
( H# M( b$ B8 S% k$ N
& ^4 B3 h) {7 {( x, ~- c
                               
登录/注册后可看大图
        <age>22</age>, R4 v" A9 \# P
6 ?; Q$ H. k0 V; N/ |
                               
登录/注册后可看大图
    </Person>! ~+ z/ d& Z  \) Q4 K" X' _

% Z! V# ]) h7 A  o7 r+ O                               
登录/注册后可看大图
</Persons>6 o" [4 q, Z: `$ P4 q0 b
5 F' d5 B* L  k( _" E4 Z2 g1 b& b
                               
登录/注册后可看大图
, d9 z6 L9 n+ ]/ D0 z/ ~
读写XML文件的程序代码:% d1 Z+ b: w" C$ k5 X' H3 @: X. d
9 {, A- o& b8 P& I
                               
登录/注册后可看大图
#include <iostream>' z+ u; g  N0 d- a7 V

4 N9 D! I* i" r" b                               
登录/注册后可看大图
#include "tinyxml.h"  c1 b. m; h2 J! W3 w) _. T
! r+ d/ f& s4 Z0 d) G: A1 n2 |
                               
登录/注册后可看大图
#include "tinystr.h"8 K+ L" y- p2 D! y: d. |8 {" w
3 d$ [. j& z( m- U
                               
登录/注册后可看大图
#include <string>
. f& J0 g( L7 G$ U* q
+ I$ Q- C2 x& D  \+ l) N
                               
登录/注册后可看大图
#include <windows.h>0 F& N! ~8 W! S: f0 U7 k

" J2 I$ O) ]& }4 A- O& @( d% W+ {                               
登录/注册后可看大图
#include <atlstr.h>
, X8 ?5 G# m$ \5 w
2 E* _. F; K9 ^1 x/ f
                               
登录/注册后可看大图
using namespace std;
: E) k5 y7 S  I8 d8 q
. ]0 q" D! _9 O' a: c" C: n1 w
                               
登录/注册后可看大图
+ Q  J% R: X3 \5 G

( F. ^1 l7 y9 D0 G* l* u                               
登录/注册后可看大图
CString GetAppPath()
/ o1 b3 H- y* w

3 l& {, e- B5 W+ z) B, ?                               
登录/注册后可看大图
{//获取应用程序根目录
1 E' {9 G( j0 ?: g2 c1 w
5 C. |" t! c* \' Q* _, v0 f5 r/ H3 b
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];& Q# F4 T! ^% L8 p

* s2 ^$ u% s1 M1 n4 w                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
1 H9 [1 e0 u  c7 P
9 |/ ]9 C8 y2 m8 t# U
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
4 D& D1 V, w$ a3 Y" d7 m& \5 _

2 S  f- ^6 q7 [6 J( ^: L) q! P                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));! w+ A2 a6 F+ p2 |4 x
7 g! K6 R$ b  z
                               
登录/注册后可看大图
    return strModulePath;
$ b# A" s% C; |0 w  [6 ^; X

+ k- R) k- ~! g  }& O2 }" _1 b( v                               
登录/注册后可看大图
}- c& q/ t* g* \: @

5 i: J) d+ C( U, E                               
登录/注册后可看大图
8 T$ F5 X. N' Q! h0 M* O

, G0 s0 `% c9 M1 ]' W! l& o                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName), c" G( V, V0 R5 ?6 ^( c  F7 Y% F

) p" V; N6 {! \; m                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
' h! X. V- ~2 l" Y  \) x% n" ^; \% G

; i4 B+ o  I4 o  c3 l                               
登录/注册后可看大图
    try+ H6 Y: i8 O& [1 V

9 s/ A! q9 E& @/ Z! O, |                               
登录/注册后可看大图
    {9 J2 Y* ~3 ]' q: ^6 u% Y

8 v" \( s6 A- j: i! V8 a  n                               
登录/注册后可看大图
        //创建一个XML的文档对象。
( R8 {3 d% \2 o, V4 \

- H' I, J* F' ~; ~                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();1 E! r+ J/ E1 e/ B
& g8 |  q8 F7 r4 v
                               
登录/注册后可看大图
        //创建一个根元素并连接。* B& U' C6 i3 l8 j/ G

1 k' k% }5 N0 S9 w                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");/ p# F/ e: m4 L0 z8 f' b; v
9 R$ h% u/ P) B/ z9 C
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
$ T: H7 V7 a0 q7 d
. r( k3 i" U  B' ^( K
                               
登录/注册后可看大图
        //创建一个Person元素并连接。
* _4 H6 G! `5 C) g# M

6 x# x( m" D$ U  J                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
) c  D& s6 z1 w2 ?$ {
  f6 M' G$ V4 C% u$ F
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);( w; y/ f, N/ r9 v' z( [
9 C' p4 i) W" A  }
                               
登录/注册后可看大图
        //设置Person元素的属性。2 L4 {0 q$ C  g: j

6 s( m. @# w' `                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
* ^* d* ^) W/ P" L( @' D( H. m

( q2 V1 U3 P: a3 E5 Y+ K                               
登录/注册后可看大图
        //创建name元素、age元素并连接。  c& M) N0 R  S0 U$ b$ i
% K, W0 R& c) ^, U
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");: s% Y0 }! w. A" o* ?( F) n- M

5 ]7 a) l, \: L7 @; b& g3 T- H                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
* n& `# P  T& R# q. h) Z

5 l: [! t8 q" R. T7 S                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
2 h% w- C3 M% u. [$ _) [6 X
5 h/ E: f- M  J$ o, n
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
2 X# l+ ^7 c2 J3 N; r. e8 `1 n
& E2 k! E( A. r. V
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。" B+ G; p0 Z5 B4 v# i+ I

+ v* ~0 T7 B) ]; Y                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");5 G0 L; @6 @5 s0 \( B" U& ?; S
% [+ V7 w  E1 n- H; O, X2 R
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
- m/ ?9 l% u" q' j# I
% }2 o9 @# d' w7 z' m
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);+ D9 W: L5 d; g9 j

6 X# ]) {' k: ~7 E, j$ y6 }' X7 q                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
! m  l+ ^2 l% c" U2 \

! {4 Q+ B, v/ f4 j. i                               
登录/注册后可看大图
        CString appPath = GetAppPath();$ y) I# x: V% R

3 O  d& S5 h$ a- l                               
登录/注册后可看大图
        string seperator = "\\";
: O9 |0 K& d6 Z0 e- p2 Q
. d& S4 p: I$ _) a" M# l: Y
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;2 s( a. ?* D5 z( i7 h* m- Y/ ]

; c5 e% x! ~! u1 l! s$ F                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件3 o4 K1 T0 D$ ^. j

; b7 e) l% M1 z' f& K                               
登录/注册后可看大图
    }( X$ a6 m7 E9 X- h& T& s

5 j( l) P9 ?. R& c! R                               
登录/注册后可看大图
    catch (string& e)3 m2 ^. A/ \. p& W
) O/ ]; D0 Y2 v# y+ \$ w
                               
登录/注册后可看大图
    {
8 y/ ?) ~# z! F( t2 @
; N6 q; A; A, K$ G& f
                               
登录/注册后可看大图
        return false;
* p) z: F* d' I$ T; \

4 \$ Y* @: r1 M1 |8 ?0 R                               
登录/注册后可看大图
    }
7 L6 i" G( z% c- _$ ~
5 q. L2 P/ |; j% ^1 I
                               
登录/注册后可看大图
    return true;, j% X6 u( d. G' d4 d# S4 C

* y* z+ T5 g7 z. s; d                               
登录/注册后可看大图
}
7 I4 ~5 x3 j8 V

2 U6 G! q* e* M  S" t                               
登录/注册后可看大图
# j6 }* I! m. I
& v6 x9 N0 G4 T, T
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)2 S2 O. _- _! \3 h( p2 F3 Z
2 e- T! m+ ^/ \* E9 u
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
8 X6 p" Q4 q! _& j; N

2 U: q% s7 t( @+ q3 @1 A: G4 V                               
登录/注册后可看大图
    try
, J1 j# v; R6 x2 r$ h! T: A
, D$ U7 y# P  m0 ?3 V- p
                               
登录/注册后可看大图
    {
- p( [7 P# A+ u9 T' Z
7 W( H2 a4 k# X. Y! x3 w4 y
                               
登录/注册后可看大图
        CString appPath = GetAppPath();1 z6 L, V" ^9 ]& H0 U/ ~  D

/ ]: C+ n3 q* z  L                               
登录/注册后可看大图
        string seperator = "\\";  P, k8 P6 W: p
4 @1 R- @8 L: {6 }6 V, h7 @
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
# S4 f1 W# h$ \2 Y* x" z* ]. i
* ?* ~; O- k6 }  L! \3 D8 ^
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
* H. _" D3 t- g( K
# p5 E5 J1 C8 D& n( i
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());' R% m. M- A0 m  N  P4 }# e

+ \; D) j+ B; f4 G3 l                               
登录/注册后可看大图
        myDocument->LoadFile();5 p4 E2 \# L4 F5 g  h/ N! [

) _, ?! `) {$ s4 M% C                               
登录/注册后可看大图
        //获得根元素,即Persons。
" I7 d$ @3 E/ f

$ n1 k8 H% l& b& s% K                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();! {" ?( k8 g& T$ r1 a. e7 w

9 [9 E: V# J  h0 |- e0 \( V# L                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。/ m6 e: j' z8 v- o
& f1 O- D3 ]" G$ W
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
3 A- @4 s9 ?( E# n; C2 }

% d! {) S7 i- \# A                               
登录/注册后可看大图
        //获得第一个Person节点。
' ~" I% U: i0 J5 |3 u
2 Y0 A* ]% Q" t6 `7 M3 N5 m, ^
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
5 z1 B; L7 W8 c/ N) l
* E0 y: A) F4 ?* p, u
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
5 k# l* n: B7 w* J" m

1 n/ A/ x/ p! |( B                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();8 Z! o9 E/ u  v1 w9 h

) B: C% D3 I" C+ f5 V$ N                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
6 I# D  J+ i3 D0 Q4 K1 y9 v
% V& W# Y; h/ ~% B2 {3 Z/ d+ J
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();6 V! e' o- D: n. X4 q) l- Q
: [) X* S( m1 a6 ?% y$ I# p  t
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。, q# P5 ~* z* n: f

  t9 G" ]; p+ r                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;0 ?  u8 g) @& K3 v" R5 f  [

  b! \% g7 C7 d- x9 e                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
" r3 ^* A( T) s8 C' |' C; n# W

/ |( T0 |) u$ ~2 o# Y3 _% Y5 U/ c                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
3 S: ?$ A( }' \! ~7 |2 G& C

9 F& \& h  {5 Q  [+ U                               
登录/注册后可看大图
    }
8 G2 y( ~$ X4 h* v
9 Q- ~2 a3 o6 d. A7 [: {. G$ v
                               
登录/注册后可看大图
    catch (string& e)
& Q% g! b- t: r9 \

' K9 [: D) n! J" y1 f  `. K                               
登录/注册后可看大图
    {
) l$ m4 X$ K- N. L
' E" j3 s+ M  t# c9 w
                               
登录/注册后可看大图
        return false;
) v9 o2 U- }8 I8 H2 Y: T, o2 Q9 A

- ~: g- D7 G4 T$ z' \- y                               
登录/注册后可看大图
    }
' R! u# t& {" I; k0 \$ J  T  y

9 W- G* o. n+ @: \                               
登录/注册后可看大图
    return true;
% F* h8 S+ Z& R  b1 X/ A

/ b. h$ K6 }$ `( s, r6 |                               
登录/注册后可看大图
}( A5 N1 V" G  g: b
- Y0 j6 c6 ]- `$ w) p* S, T% r. b
                               
登录/注册后可看大图
int main()
/ j0 q6 M7 I- a1 k0 |. m  i' |" C* F
! ~2 i9 g5 V# x- z
                               
登录/注册后可看大图
{
' @/ \3 _8 O; S: j9 L. o  L. G
: \; S' ?. i' m# d
                               
登录/注册后可看大图
    string fileName = "info.xml";% G8 [# k& c% c# G( N

( ~; X; y7 p; x( l( Z0 }# r# ^* z                               
登录/注册后可看大图
    CreateXmlFile(fileName);
. e( c$ {+ @/ S

5 E2 V1 I! C( k% y( p) y- R$ g                               
登录/注册后可看大图
    ReadXmlFile(fileName);
- y+ J2 j% U1 R( }: C- T+ n4 p

  u9 k) {5 B' _  c% k; i- T3 R- c! k                               
登录/注册后可看大图
}9 T6 i2 J' \9 C5 p) R1 i

- z+ |+ t( A- _* j  G                               
登录/注册后可看大图
( |4 k5 g, W, I! m& i

" J7 D3 c# {8 F$ \5 M
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  & a1 {5 X3 P9 r5 h' R
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了