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 4239 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片段:  n3 p. n% h3 S* ?+ O0 ~) s
4 K% d/ z* p$ L- a8 r
                               
登录/注册后可看大图
   <Persons>
6 E1 k0 N) H. ]% ^, Q( M( U
, V# \% K" k9 |' n2 b
                               
登录/注册后可看大图
        <Person ID="1">
1 S, K8 z! s4 z! G$ G
( X  f$ e9 T. P6 h3 j4 {
                               
登录/注册后可看大图
            <name>周星星</name>
( D: U7 {& j/ b' Z. L( ?

3 k, W4 \4 I6 q. X% s5 x( o% {                               
登录/注册后可看大图
            <age>20</age>
! [8 n1 h* w) O% _* t7 v# d
7 C* w: ]; x% G& Y
                               
登录/注册后可看大图
        </Person>
3 |- x1 w  o$ G/ [7 j: D* r

% S/ A/ U$ x4 N+ T2 D8 }                               
登录/注册后可看大图
        <Person ID="2">
/ Z: a1 R! H! }0 a) C. d. B
  z, R  F: m2 @: F9 k: u
                               
登录/注册后可看大图
            <name>白晶晶</name>5 Z" B) L* [! c& W# @

: s% |0 q; E- R' O4 E5 B                               
登录/注册后可看大图
            <age>18</age>
; l, C; }# \+ u9 h4 J) |
! k8 H2 _$ z0 o5 u$ c
                               
登录/注册后可看大图
        </Person>  r; H# U; O+ o$ R, a7 c: H

. `# J: Z- k. ~. N5 {2 Z$ d                               
登录/注册后可看大图
    </Persons>3 z9 l/ _8 _9 r; F* t) U" b
. U6 q! v" a0 ?( E! n) e) \4 I6 e' H
                               
登录/注册后可看大图

3 ?6 A3 S( \' U/ W% Q. v  z- n: x
在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文件:
4 X& y- S- U) ^  y
: C  z* ]( q! Z6 ?0 L$ k, L) v/ z
                               
登录/注册后可看大图
<Persons>& F- @3 Q7 Y* D  h. K
  y" j4 l; E5 n) Q( S: I
                               
登录/注册后可看大图
    <Person ID="1">
  f" }* H1 t* `* P
$ t# x+ w5 G0 ?4 w; ^0 H
                               
登录/注册后可看大图
        <name>phinecos</name>& M7 ~. f! K& H; {9 }6 N$ Y. n5 [
3 N$ k0 O$ a7 U6 Z; \
                               
登录/注册后可看大图
        <age>22</age>9 h. ~' E+ P# q

1 s" z9 |5 R- `  s) q                               
登录/注册后可看大图
    </Person>
( t  C( e9 F. P: m) k3 I* v! p: b
% t% g% l' G3 a- t7 y
                               
登录/注册后可看大图
</Persons>
( r( I9 S' p, y$ w" Y9 w
/ P2 l: q3 {/ E3 k! C! v
                               
登录/注册后可看大图

: b; o9 g6 R  ^3 ]0 H8 F- v
读写XML文件的程序代码:% B7 W  c; b3 N) s2 J8 b8 W- a9 W
6 t) t' o0 X' `/ v" V
                               
登录/注册后可看大图
#include <iostream>) c- S* V+ E/ X

& d/ M4 d1 G9 L7 r8 H! F                               
登录/注册后可看大图
#include "tinyxml.h"
8 X: y9 J4 I# {) {$ K

, A( G" M* h, S% I# l0 G# p& v, B                               
登录/注册后可看大图
#include "tinystr.h"! o# F3 J3 O% h3 x7 `  N* E
% b( i6 {3 k( @' \+ i
                               
登录/注册后可看大图
#include <string>1 {0 {) x, ]" }
' j  K! _. D. C' O7 r
                               
登录/注册后可看大图
#include <windows.h>9 x9 u9 B! V. S

' ~4 J, A* X  L$ h  z                               
登录/注册后可看大图
#include <atlstr.h>% T& G/ ?# J; I* ^6 Z3 F% p
6 w7 d. _+ U& k& v1 O
                               
登录/注册后可看大图
using namespace std;2 ~' Z9 J2 k9 T
9 D' x: K$ R) D8 e: W& G" Z) T( q
                               
登录/注册后可看大图

9 U/ T4 k7 D2 t3 a6 V0 M$ _

( V  D- o* e5 o- {; A2 c7 G, g# c                               
登录/注册后可看大图
CString GetAppPath()
( o7 U6 d: \+ w* e: [( i
, s: z( O4 Q4 k4 e+ l
                               
登录/注册后可看大图
{//获取应用程序根目录- g5 Q/ q& k3 q, }* R0 o6 X3 h

- n; X" Q/ R! J( A) p, N                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];& U' k# [) k, [- i/ _) D( ?
: I8 o8 }1 T/ Y$ n
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
# E' j; R2 ?# i6 L$ O& d' [
& d' F3 [, T7 _- t
                               
登录/注册后可看大图
    CString strModulePath(modulePath);+ L# G4 q! d+ t% D& c
4 _# K) \+ h9 i: ?7 K
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));% v, q( l, ^  b

3 H7 u1 `( M' i                               
登录/注册后可看大图
    return strModulePath;
3 n3 q6 x/ X7 \3 h: K5 v+ P

/ O. N$ C  z+ G7 A                               
登录/注册后可看大图
}
9 P; q1 |' Z* O) P. G/ V6 y
! r! m# X3 P8 y! Y/ g1 g
                               
登录/注册后可看大图
2 N5 S* o5 Z7 r/ l# b
5 E% f( Y/ P/ y, G9 G9 @; F; D
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)/ L/ c$ `+ _' P. [5 I( ~

/ p1 A2 i  z0 S$ N7 |6 R                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false+ U: c7 Z- O' ?; a

  q/ y7 O/ {1 o: I. B& Y9 ]% c, E                               
登录/注册后可看大图
    try
& B& U; c7 N3 ?, b# T

9 h+ ]! Z3 N1 d" i+ a: y2 {                               
登录/注册后可看大图
    {
+ k1 f' b; T$ J: Q9 N+ h. _, p% c
2 B) R# j" K) w
                               
登录/注册后可看大图
        //创建一个XML的文档对象。0 r- D& I) _9 f/ i1 b

5 Z  D  G8 Y) y2 m* E8 u) Z                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
7 V, g3 R. g: b

6 @  C2 @. r& X/ z+ f$ h" Q1 j# N( Y                               
登录/注册后可看大图
        //创建一个根元素并连接。
3 ?  T4 V2 [! M- O
' ^" L7 i3 U0 ^3 ]; n8 u3 H- h
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");; i; @/ i+ L+ Z* v; \, U
9 Z/ D# ]8 J  F5 Y2 M* a6 `
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);  D- r- h" u. x( x
2 I9 }9 O* I# F, Q% U
                               
登录/注册后可看大图
        //创建一个Person元素并连接。: V7 C! _+ p4 E. s" d% y
5 k* D" i3 \3 t+ G' I: J, k
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");# {: K; r  q/ S& B- j2 `5 h
" h: j, u  `' T' l3 S$ }9 t
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);+ ]0 P' E7 b/ |) @. K) L
( Z, M" o, \: [2 F, c4 ^
                               
登录/注册后可看大图
        //设置Person元素的属性。. t  f% w( C$ j3 M* U4 L

; G6 K, U' e, k7 [; a                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
% ?8 P# l- _9 m! u2 T

$ v# X) ^4 T& @' {. ~5 V2 f, S% y                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
8 e# _' V1 A" m3 f
% |7 S) {4 W" {) _% H1 {' |9 l5 d
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");, v+ [7 I& K  U' E2 B

- D; I" R7 ]& Y! r                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
$ E+ e9 C! @" E% \0 G

0 p) A1 i8 r0 i5 D- s. C3 o  Y                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);9 v" t7 q! J; y- H6 _& R; q& \; t
, R9 I5 c1 A- I
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
8 D0 }% W; G& F9 e" q$ l
% U( b3 D1 {& Q5 z; }$ `- t
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
; A. \. {9 b8 q7 |( w. g0 S* e
" W: E+ U8 _- |0 e
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");( l+ L7 b8 v( e7 y- M/ J
) H+ t# \" z2 r
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
- {! C' r. Z( }3 E& g) U& x, R
& C& h8 s' \* i+ ?+ D
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
) v. A- g; B& ?. m

5 H' Y7 W: [6 C9 a                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
; R2 v) c+ M# F7 z

2 v7 g6 c- R8 K3 u- X2 W- b( N                               
登录/注册后可看大图
        CString appPath = GetAppPath();; D, J, s+ o" X0 @& B' i; N
4 B- B: u0 S; x; b% w
                               
登录/注册后可看大图
        string seperator = "\\";
1 q, Q1 k$ d) l1 O
; Z# I; l4 w: C; P
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
: D& F9 _; e' b" c( V8 J, ~
) M" f% B8 J& V* P: J
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件, {0 Y) V3 X5 i
: `! c3 E# J/ E$ M
                               
登录/注册后可看大图
    }
" @; L0 t* R# H: `% g- Y

+ v5 ?" [# K8 ~+ h% O+ s/ q5 X                               
登录/注册后可看大图
    catch (string& e)
' t4 l  h! ~$ T. a: X0 d2 ]' E

5 t  i5 b2 k2 I; ^4 s% K                               
登录/注册后可看大图
    {
( H7 b6 C1 O9 V& J% a* g
2 M+ ~1 |, x; h1 t6 j) r8 T7 ]
                               
登录/注册后可看大图
        return false;
2 B' q' K4 _2 [

! a. d8 ^+ }3 s% }                               
登录/注册后可看大图
    }
3 H7 ]5 f) x' |' e9 ^# g
/ ?* c  z; c9 @) W' y& A% h
                               
登录/注册后可看大图
    return true;- Z$ `  t4 P8 j! h0 Z

- P& g/ V% m& X. E' j0 S' J6 J                               
登录/注册后可看大图
}  M" V. f& d' m5 W4 B

4 D7 G; n$ s# f7 d8 i5 V/ ^                               
登录/注册后可看大图

2 l- t' E8 l% Y2 r4 _/ U0 `% \. s

7 V: {' G8 Y6 b7 O* {- o* f8 |                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
( e6 v7 l; G. l/ ?

' ^3 q8 Y& u* q* S                               
登录/注册后可看大图
{//读取Xml文件,并遍历
; g  J  Q/ a) k. |

% z. \# Q8 a7 E6 H6 Y' f& N4 p                               
登录/注册后可看大图
    try
+ h. q4 h/ |6 O/ q1 H

& ~+ m5 G' l, I8 _" @                               
登录/注册后可看大图
    {; [9 m/ f' Y% y' O

" {. k/ z) f  N4 J                               
登录/注册后可看大图
        CString appPath = GetAppPath();
& ?6 q$ G% W- f: k8 G
% O& ?- b6 k. J) I% G
                               
登录/注册后可看大图
        string seperator = "\\";
+ e$ |5 S0 z) ^% E9 o" t
8 g7 d9 d$ s7 s+ q3 @) }2 ^
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;3 n9 h4 Z2 [  @; J8 G( H6 U  G  p# a
/ ^) `8 L6 _4 g% z7 U
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
5 a7 Y- [, s9 _3 E% j% s

& g* s2 z  x( ^' E  p2 I- J                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());* H' p4 ~$ O- g) \( r) h/ z6 d

; b$ k- W1 z/ U3 |                               
登录/注册后可看大图
        myDocument->LoadFile();
9 j0 B( F8 v2 f) G

; n' \" b9 G* `0 r3 Z" t, G                               
登录/注册后可看大图
        //获得根元素,即Persons。
- _7 u" x, G1 ~. A+ ~3 ~

) k. u2 N6 y/ I* W, d1 y                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();9 l5 }. o1 f2 s# B! H
% s& C5 V* y! z8 ~& i% a# F: F( K
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
0 x& B; [/ N0 K7 y( b1 t( B

# I( D* j& `# N" b0 F; p9 ^2 o9 y                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;3 i7 H9 P; a2 x: W9 p  J

2 x1 @# e' `" e9 k1 k0 v                               
登录/注册后可看大图
        //获得第一个Person节点。
2 k/ {: r. @: w% k* v

7 |! d7 D4 W4 x; y. T6 O/ t& c, |                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
  {, r2 }( m9 \0 n

0 U2 m& G" R* v  f. D2 I. r  l. P                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
* B3 x( P% M3 Q6 O$ t5 @
8 |# a5 t7 z1 _. V$ V: g
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();" Z, ~# K' \+ U+ f) |% {

1 G; k' y' Q+ v5 B                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();% p) O& @  _) K; V

# s3 U3 h* S- n  s6 B1 g( h" J2 I" [                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();9 h9 s3 l  k; l7 Q
0 t, g4 F4 e$ o# p3 _4 R6 N9 G4 i
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。8 z6 b4 L! a$ m: t& K; z* ]# n
- ^, ]4 L: @/ s  U* Q6 J6 T7 M
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
+ r, V1 M5 G: P" v8 y$ L: n
* g9 ]7 U1 x( O. q* {* ]
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
9 J- w, ~3 Z1 C
, W8 G9 P* S$ l7 V3 T" \! C
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;$ n, T; E/ X' x7 Y2 h6 K

9 b. C9 o8 r; a                               
登录/注册后可看大图
    }
  T: x7 p' l0 Z) g0 Z

1 e# |2 Z( R& `2 I) B, \1 S                               
登录/注册后可看大图
    catch (string& e)
1 _. E( i7 r6 O5 I
4 G. ~2 L% T9 y* M) Y
                               
登录/注册后可看大图
    {& ^' n$ [2 n3 k* C& m( E+ A0 P
* J9 K8 h+ z3 _3 K' p! V
                               
登录/注册后可看大图
        return false;6 h) \- p& ~; c- }  ?; X% _

1 u: K; f+ O: n: ^                               
登录/注册后可看大图
    }: T- G6 ^0 b1 P( P" @
" S& l9 t: G* C' F
                               
登录/注册后可看大图
    return true;
+ h' F' a: R- y
' T4 u/ T( s, u, S1 C; x
                               
登录/注册后可看大图
}
: ~5 @4 B* `/ ^
3 g& I- |; Z; f2 T/ [2 U& X
                               
登录/注册后可看大图
int main()
8 A& O. N, C, ^/ a' x

% }/ g+ T; Z5 ]$ c8 V                               
登录/注册后可看大图
{. D* A0 G! Y; ^; ~/ I/ \- i$ m
% _/ x+ @) e* u  i
                               
登录/注册后可看大图
    string fileName = "info.xml";
9 S( p. T$ u1 z0 }9 \

, {# b( Y6 q9 ]* o                               
登录/注册后可看大图
    CreateXmlFile(fileName);
, j+ j! F5 O7 g. _8 P0 {( y+ B, A

( d3 m  c( a8 T' [1 o, _! x3 V                               
登录/注册后可看大图
    ReadXmlFile(fileName);
" ?+ a$ L5 I6 J2 m3 i, s

* a- ~% o" o0 _; g  K                               
登录/注册后可看大图
}6 n" R3 |: w0 s; z

& i/ p& {3 t+ ~$ W                               
登录/注册后可看大图

& A+ @: u5 j/ O1 l3 q+ m% R" H! M8 f$ z
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
" q7 O+ A8 p/ z) n
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了