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 4274 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片段:% Q) F8 d6 \1 b2 q

7 C9 o# F8 k: R2 T  }0 L/ K- ^/ v                               
登录/注册后可看大图
   <Persons>4 ?4 m% f0 F( P
$ B+ D8 W) V- e. `9 [6 t7 S9 s
                               
登录/注册后可看大图
        <Person ID="1">
) r/ o7 e& X  J4 d. t: Q- g) ]4 B

5 N5 h. w4 }* ^" |+ x! e( f                               
登录/注册后可看大图
            <name>周星星</name>$ U9 Q$ t7 @; b" A: `0 u! [
7 |6 I; g+ Q4 \+ n& N8 B& }, C) O1 Y" G
                               
登录/注册后可看大图
            <age>20</age>" A- i9 W, n  E0 X- U% R

, K! d5 a4 V0 q8 W. B                               
登录/注册后可看大图
        </Person>& s, M' N. j8 P$ J7 b4 L. G5 [

5 e8 y; `0 v5 {                               
登录/注册后可看大图
        <Person ID="2">- P2 j: X, t- S! D

1 ^: R/ \" P1 P, P                               
登录/注册后可看大图
            <name>白晶晶</name>
( K! R) b" a' p" j

. r: L  p1 S+ F% A& M5 k0 q. D- ]                               
登录/注册后可看大图
            <age>18</age>
- G; X( O& G* j7 Y, z
6 Y# o) x7 P1 y- n+ O
                               
登录/注册后可看大图
        </Person>% {  o' G% N6 `7 k2 f8 S4 u" P
& B) W( T+ \( y% {' n7 S! G1 v3 r" d
                               
登录/注册后可看大图
    </Persons>
" v3 I+ G% |) V; m7 L
+ V) C& T# j1 ]- g
                               
登录/注册后可看大图

) X1 ?2 Q1 U+ o" Y8 D% E7 G
在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文件:
- C& [) z& t( Z7 N, b

1 r7 M2 g, X$ T/ J( r                               
登录/注册后可看大图
<Persons>7 Y# |6 T  p/ H6 |

& d# u' X' z/ M  P% u" ]# Y                               
登录/注册后可看大图
    <Person ID="1">
+ b( |; C: L' O; |' I& w
$ ?2 ^) ?3 [, V4 v5 E) e
                               
登录/注册后可看大图
        <name>phinecos</name>
: H9 u2 k" t" ~! z) u: n
1 l( X0 B3 Z' ]/ ?9 P
                               
登录/注册后可看大图
        <age>22</age>
0 Y5 G+ F7 u+ x

* W& p# E8 D+ v4 P                               
登录/注册后可看大图
    </Person>
# o/ C6 l- Z( W( _5 e) \
) W. U" Q, |7 ?3 z) ^+ x- c
                               
登录/注册后可看大图
</Persons>
3 }& w: J6 p0 X' a

: ^, w5 l- ~- k0 j                               
登录/注册后可看大图
. B4 f2 k/ T4 x$ |% C9 R
读写XML文件的程序代码:( i+ u5 [' @1 d! o; y- G

* \' L+ y6 C* R3 k                               
登录/注册后可看大图
#include <iostream># a/ U* g6 m# _4 K

9 j. }+ e$ R: ~" v8 m                               
登录/注册后可看大图
#include "tinyxml.h"  a% O1 N, P, w
  m  }6 l- h7 C; S/ D1 A$ j
                               
登录/注册后可看大图
#include "tinystr.h"
8 ^( P1 {5 u+ K/ M5 r' s
- t9 d9 o4 C, i+ b9 ^+ l: g
                               
登录/注册后可看大图
#include <string>
% K7 A" o4 N' ?, _: ^
) _. Z5 P6 m1 `  r$ Z3 U
                               
登录/注册后可看大图
#include <windows.h>- h6 @3 `2 ~: ^/ Y& X. _, o  L

% {) `( j6 c2 c! Y: C" f                               
登录/注册后可看大图
#include <atlstr.h>
. I3 B) \0 t" ]# W4 i5 N& E* `: @( S& a
6 v! l) a# f) a: V
                               
登录/注册后可看大图
using namespace std;
- ^3 e+ V- m/ g1 t' M1 x
! s$ V3 Y9 C; ?$ o6 o& c" c" U
                               
登录/注册后可看大图

* Z. S) t8 j# r4 @9 r) h& ~% H
; i8 H0 S  u. z/ }/ i. E9 x
                               
登录/注册后可看大图
CString GetAppPath()
8 p8 w' o; _2 M6 j* U

( E, k1 G3 E; @                               
登录/注册后可看大图
{//获取应用程序根目录0 s/ k0 @- i' K1 ?, a9 j

- @+ x7 i# S# M# @" ^                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];8 Y- y' U1 H2 s! q2 }# |  U

! p' F' C5 s. q  P+ \                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);, l  N5 G7 s: U" m$ e( p; i/ \

- u$ f$ I: i, H                               
登录/注册后可看大图
    CString strModulePath(modulePath);
& Y# ~; O* K2 \

1 _) o3 v, ^! ?  k                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));* _$ p* X) Y. R' _, a# R

* _# K, X5 l# t+ \                               
登录/注册后可看大图
    return strModulePath;
! I9 x" E' `& ]( j& A' {
' M. q5 s! H, P1 B' k( J
                               
登录/注册后可看大图
}
/ v9 @- N" V0 f7 K) ^
9 h, I3 z; N0 s, y! w2 l. i
                               
登录/注册后可看大图
# y( P* I9 e7 i
  K, U0 g  V% T! B
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
, v7 `$ H" o/ z3 d9 U, q( x* G
9 D' D; _! x' u: s
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
, Z' y+ e. L2 L
8 I; ]7 I& H0 |- \) F
                               
登录/注册后可看大图
    try2 N& x: z) D# O! c/ k$ b  q' k' V
. u$ H" Y4 w* b2 W, U6 ?% I1 g
                               
登录/注册后可看大图
    {
& z& X/ c6 q, w& ?+ f5 ^
/ n" g& `$ t) U
                               
登录/注册后可看大图
        //创建一个XML的文档对象。3 S, y, w  |  ~$ `& ]; A1 x
9 c; z0 p9 d- s& z( {0 |% Q
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
( T; Z  A: z) ?; I' b# [

  Q4 E4 `' l& X) G5 i; B                               
登录/注册后可看大图
        //创建一个根元素并连接。( Y$ e; Q) y/ `

& @0 o" D# d7 t, m( }8 x                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");* F% c9 N" D% [0 h2 \: k: U+ u$ ~
4 B* D' \4 M! I$ G# B
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
. P: J9 M$ v7 M! @5 e
8 p% b6 A( j9 m' a
                               
登录/注册后可看大图
        //创建一个Person元素并连接。0 {6 g, d0 G* x6 c5 c

' l* Q9 B9 }3 n' L  d                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");4 n8 [7 W$ R" ]
3 A( G$ k/ g" u5 s
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);2 u0 s9 [  E2 c9 d

2 p9 ]* f- A# f- k: x' d                               
登录/注册后可看大图
        //设置Person元素的属性。
5 R2 B, e# S* D+ j( n
8 M6 l. E/ n; s% m8 z+ L" @
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
+ @% g! f7 k# k+ x4 C5 _

2 t- F* Y2 V2 [2 r                               
登录/注册后可看大图
        //创建name元素、age元素并连接。) v8 t+ l" F& Q( j: G$ A
0 U+ Q$ L8 h! |- O
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");4 z5 u5 C4 F! z9 @/ A: I
. \4 \1 m1 K, t7 H( i
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
$ v! u, d, w6 ]- Q1 w3 z! F; U+ m

. h* i( K% y  K; P) W                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
' w- X& \* g: @

* d# C, `+ ~9 N" g                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);( S$ i6 s$ z  K; y3 \3 ]  |; D2 G
, B: i: ?3 H5 G* h) Y
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
9 P2 P$ V0 Q5 c" _9 h6 W9 x
& o. f; W9 h: }* C: p1 Q  e
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
# s' m! M9 t+ j  K* r& |6 N6 C
4 T) t" w5 y9 |" O
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
$ I8 X9 `- m8 d
- l1 a& B* E. L0 U/ w, V0 q
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);' O/ S2 m( z0 |. n: w9 Y

; F' x& x) C  Y7 i/ [! U                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);( `- w- o# X: `! ]
: h( |) T$ ^0 B: a1 c/ n+ B! h
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
$ ]; w/ Q" |6 Z

, f$ P" m. r/ |# j8 f                               
登录/注册后可看大图
        string seperator = "\\";: j0 N, D, }* _1 y

, D; ^( o5 X8 W" f* A. C                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;1 z1 \* T) Q1 M/ s) n7 j: r

- L6 O" F  N0 U, l3 s                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件3 L! F: F+ T( x, v. E
! E  P2 U: {! N) w; h4 b
                               
登录/注册后可看大图
    }
6 S/ E  b! k/ ?+ R: c

% E7 P2 {7 j5 y: P; B5 o                               
登录/注册后可看大图
    catch (string& e)
1 }) N+ B; t! W  r' k# F

$ r; a# X# x, z; w6 G& X- x- r                               
登录/注册后可看大图
    {3 v. v' {% x% [1 ~( v
3 R1 D' X8 V! A/ p: f
                               
登录/注册后可看大图
        return false;# O% N* C' ]8 g( [2 M
: O; |+ K* G: N) v% |
                               
登录/注册后可看大图
    }
. r) M# g+ T( b3 q; ~3 Z

1 f% C+ m: R" G. G                               
登录/注册后可看大图
    return true;  X4 x# V9 F8 {9 f5 t
5 `4 f% u- T5 |; p$ Q
                               
登录/注册后可看大图
}
8 _6 ~$ v" z! ~, |8 |
3 ^, b: _" d. f0 u
                               
登录/注册后可看大图
" T0 n* L3 O! g; b' u7 n

3 Y, a% q9 x  z, C3 c2 N: E                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)* y' g7 Z8 D3 Y; h  j- F

3 t' y2 `; c. y; Y& t                               
登录/注册后可看大图
{//读取Xml文件,并遍历/ z. l: H& L# J* Y
6 C3 N3 q! z( \  o
                               
登录/注册后可看大图
    try
# l  w3 I1 a$ r- g" B7 X
" |) V. b) o6 y1 l: Q3 c& s: K
                               
登录/注册后可看大图
    {
3 Z2 ]; E3 P5 T: s5 q
* l3 M6 d  w6 Z: Y
                               
登录/注册后可看大图
        CString appPath = GetAppPath();# [& K8 {% n" G  z) d& S* `
! w- Q/ U, c2 `! H: P- x
                               
登录/注册后可看大图
        string seperator = "\\";
+ b' ]* g2 O% X0 c( O

; n3 K/ Q. R8 I1 a- k                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
9 h, f7 Q/ B+ M* Y3 z0 q

8 r  F( ^" e- a+ }* n                               
登录/注册后可看大图
        //创建一个XML的文档对象。
' `/ d6 g& R4 R

; c, K1 y/ [! Y+ n& O8 @                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
- c: ]9 U% a$ m6 g8 V
  K$ ~( o6 l" F: P* r& c  E
                               
登录/注册后可看大图
        myDocument->LoadFile();# C4 n$ U# J. D6 e: a2 ~
# i, J8 M& a4 a0 n
                               
登录/注册后可看大图
        //获得根元素,即Persons。
4 a' r; h4 a6 R# ^, w
/ X6 t2 O% V! e6 Z- D, Y9 N' c
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();5 \8 B  s4 ]! j$ b1 C# c

# o6 }. r$ n* K& u, ?: C                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
6 N5 k1 x) s9 H

: i9 `( a0 p* n2 V                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;+ y+ ~5 ^& g) L: _. ?1 ?

$ J( d* R5 {! Z( S. I0 @, T5 O* Y                               
登录/注册后可看大图
        //获得第一个Person节点。
5 b& t6 x$ ]% I4 m- f" D7 S% E! l4 R, w
3 \# p3 @4 |8 u' B0 b* j$ [
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
2 Z+ V6 L$ _9 V+ N% u) q7 _; G1 \5 h' x

9 |9 `! {# u; E8 |# i7 j$ X4 ^                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
' ]' N- X; V1 |+ U- k
5 H: [+ {8 }# y1 @4 i, J/ @
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();8 }9 d% H4 t, h/ X/ Q5 L
8 |% G2 |) p$ C+ p9 F7 f( J3 w- ~
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();# Y; b1 y$ X" b

2 U# c* e  f9 {! y2 S                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
- B0 w) a- o7 |* h% _7 z
  x. Q* g$ y+ h7 U
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。7 W+ s; v5 D, `; o7 D; o) U# Z
, c3 s! U' ^3 S8 J; ]# X0 v
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;0 ~+ H6 E1 P6 `% b: ]  c; t" X& r

" S9 f1 ]8 N9 X                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
% Q2 b2 ?$ Q9 q# g% g% g: |

: z% Z. ?$ L) [( H; V- j                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;$ Y+ a( g. n/ R  P4 `0 }
, q" S3 h# s* u" {2 v/ w
                               
登录/注册后可看大图
    }& |7 b# Y3 v$ w& W

6 u- w; o# D  u( Q                               
登录/注册后可看大图
    catch (string& e)* W4 {! K3 ~$ `( }

) W- I3 l" \7 t; T  C% M0 Z                               
登录/注册后可看大图
    {
) F/ z- m! x( A3 o- U7 E
( o+ D0 {/ G2 p5 g! a
                               
登录/注册后可看大图
        return false;# e1 t) Q& D; O! s2 O

0 C7 O9 U& [& a. Z                               
登录/注册后可看大图
    }
) }5 m# K9 D' M" j
  i/ m3 ~3 I2 l/ _2 `
                               
登录/注册后可看大图
    return true;/ ^: ^3 k) h7 i4 u

" f4 l5 M/ S  T                               
登录/注册后可看大图
}
$ j* ^7 h8 \  K5 P$ J& [# D

9 N% v) U- j. s( S3 q                               
登录/注册后可看大图
int main()
" S+ Q% X4 `, b0 M1 M4 C
5 s& _# k% S- z: R$ P* I- T
                               
登录/注册后可看大图
{; f9 t. N' G, a7 s! D2 t
5 z* b; H6 r, _$ Z
                               
登录/注册后可看大图
    string fileName = "info.xml";9 l1 d$ {& q6 G
( k4 |; l! x+ ^" d* N! O
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
% h% ^$ v; @8 M: }, x- q: h/ d1 n, N

( J0 p2 }, e% }. A2 f4 |6 v7 [                               
登录/注册后可看大图
    ReadXmlFile(fileName);
1 y9 R+ W8 w2 L! [% H+ @

. F) b$ a" l2 ^$ O                               
登录/注册后可看大图
}
" N3 m3 u$ f; Y0 @6 T& s5 D
6 D5 n9 ^. b* B) @+ v7 r) p, M
                               
登录/注册后可看大图
7 ^" F( W  a' L4 Y: _& E
4 h6 `- M) Q. r2 I5 c3 G. i, S
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
8 P$ _* r* S8 V6 C; P0 c) i6 D! ^$ v
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了