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 4275 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片段:' c0 w0 X; R# [0 V1 u* A* b: f
* b$ P2 d6 V* p' U3 h/ U
                               
登录/注册后可看大图
   <Persons>
5 q) I) r7 @0 s& E  r) `
. q& S6 M1 n, [% t1 A' E( X
                               
登录/注册后可看大图
        <Person ID="1">
- Q8 j$ i/ @$ Y

$ p) }) A) X/ s                               
登录/注册后可看大图
            <name>周星星</name>
6 Z* _4 z, ~# j$ a# c5 w

) B( L+ e: ~6 P+ h                               
登录/注册后可看大图
            <age>20</age>
3 @/ z9 R5 u- `  s

: U; _% P: e! I- I2 F                               
登录/注册后可看大图
        </Person>% Z5 d8 ~9 M$ F
; o0 Q; _5 ]! {. l9 x
                               
登录/注册后可看大图
        <Person ID="2">$ M3 Z" Z+ t# L$ f( D) m" u: a$ [

8 x# N% e  T" R) Y9 y% r                               
登录/注册后可看大图
            <name>白晶晶</name>. }. I% P3 p3 N4 p0 n3 O' D( M

# M/ V/ S& \; i) t8 s5 O                               
登录/注册后可看大图
            <age>18</age>; @3 ^5 a6 ~" t. l& Z

+ S# l0 J; S$ k  ^8 G. Q                               
登录/注册后可看大图
        </Person>! n9 m5 j+ M7 z& y; F" e3 x. }
  m0 r: y- G' j' t4 U6 h
                               
登录/注册后可看大图
    </Persons>
' k8 E$ H) o, L; z. s% P3 X+ j  c
( r6 U  }0 H+ v' F
                               
登录/注册后可看大图

/ t) b5 E" r% f1 o8 z' W1 {8 v7 E
在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文件:0 b5 ^1 @  O  \8 ]/ Q4 _
9 F$ m- D3 t8 _' |. ^3 X, `' e
                               
登录/注册后可看大图
<Persons>
2 L& V8 R& M; g, o7 Y+ H, N

8 j" @; e  s2 _' W9 Z+ s5 s                               
登录/注册后可看大图
    <Person ID="1">, h; h# G- Y3 M9 u  K

2 D$ r' b) h; a- q$ T                               
登录/注册后可看大图
        <name>phinecos</name>
9 Z/ ~0 _0 H4 L+ ~! S% x- F5 U

( e; e! w6 [$ ?& U4 P. \                               
登录/注册后可看大图
        <age>22</age>
5 r( {0 f" t. z$ ]) w
: v( z$ b) ~+ m. s) \
                               
登录/注册后可看大图
    </Person>
5 r# p( D' `* ?8 A) s" D: |# c
# g7 g5 ^: l; w  t! [" L
                               
登录/注册后可看大图
</Persons>, A1 f- t4 V) Q/ y8 \1 j( H5 O) q# G

) |( s" h# N8 }1 }, i                               
登录/注册后可看大图

0 n( W6 H9 N, P+ D1 f7 B  t2 A8 [. w
读写XML文件的程序代码:
0 Z' V" w+ Z" R* ~1 R
7 ~* |  Y3 [' O; F7 g7 r4 e. C
                               
登录/注册后可看大图
#include <iostream>+ @  B6 ]- A$ r

9 g+ q0 D* l0 g6 ?8 S3 F4 [1 y; c                               
登录/注册后可看大图
#include "tinyxml.h"
" N; G& Z7 Z) I. x. q
/ T$ y9 o9 Q2 `/ o
                               
登录/注册后可看大图
#include "tinystr.h"
4 v, _; F/ y- c& y% b1 D
, y9 w; X0 X8 |8 N. B& r) O- |% h
                               
登录/注册后可看大图
#include <string>
4 Q. z( O) N+ D8 F% @, h
$ n& b+ W" V6 Q1 `
                               
登录/注册后可看大图
#include <windows.h>
7 J' P2 j8 p4 _  g# M6 X# ~
" [, |$ U( e2 d
                               
登录/注册后可看大图
#include <atlstr.h>' @- Q0 R7 }( ~! X

& K% M0 \- I- J& U1 I% g                               
登录/注册后可看大图
using namespace std;8 {5 n% ~3 v; B% _  `

- \  E7 r- }  H0 v                               
登录/注册后可看大图

0 F4 j, z3 S9 U
& o* ]. l& [3 ?( R
                               
登录/注册后可看大图
CString GetAppPath()4 l3 ]& Y+ K6 j! X7 L/ B/ Z
6 g& Y- D4 b1 b
                               
登录/注册后可看大图
{//获取应用程序根目录
8 L5 r  U) G8 d( I, c! [* t  G) v
$ ]9 D( z3 ~8 t, l. U$ F' P( g
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
( G% e1 {+ U( D! y

1 o5 R+ B$ p2 o) [% a$ a( x- {                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);8 a: F9 h( e' ?& P7 i+ o9 ]
( m  `/ d1 K9 A3 d) i) L" ?# H
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
/ }: m4 d5 |3 P; c( F( P4 v, |

' F8 {9 D, [& I$ {5 @* ?                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
. I$ i" y, M  W/ v. Z% }

4 T9 n6 _1 R: L6 D/ `" K                               
登录/注册后可看大图
    return strModulePath;% t1 f# I* h  M4 A

& M8 V+ x5 s0 v. W                               
登录/注册后可看大图
}
' N. `) S" A; L: ]2 A! w

# e1 J8 G% R/ y5 r6 u8 N7 b" }                               
登录/注册后可看大图
% m& O& q8 C  p2 y( A
3 c. o. K9 ]  ?0 r- _& G( d
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
! H( c9 ^& X0 c! h, u7 N' ?3 d

" E/ B. O$ s1 F                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false, d9 M1 o7 ^. S& }9 b% T
) h* s! J9 K! |% h( h) X% s
                               
登录/注册后可看大图
    try
; h5 S7 E. S+ Q* [

. h/ v; @  l) Y' o) J8 Z                               
登录/注册后可看大图
    {
2 k: |1 Y2 E9 \

" K( Z1 ]( L- C3 n                               
登录/注册后可看大图
        //创建一个XML的文档对象。
- O6 X" _/ C) v! a! n7 c

7 y, d; P" f# J                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();$ o* c2 G/ P, n
: i+ V/ V* v/ K% H! m
                               
登录/注册后可看大图
        //创建一个根元素并连接。
( @$ W; |0 F7 u$ Z- n( f( w
* Z! U8 [4 j; [
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
2 e& w; e0 ]  M! a
' u8 a4 s, X  K
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);; v! Q. O6 g; V% w7 T" m" f

) E4 I3 T, _' ]- h! n0 i: K                               
登录/注册后可看大图
        //创建一个Person元素并连接。- T0 j% d: v3 z! N4 S+ k* j$ ^# n9 z1 f
+ A* V5 W$ [  D
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");, d* Y! ?3 r5 h( U9 A
/ M8 a* E* h+ z
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);3 K0 J5 U$ s! Z( Z
1 i; U+ E& _% _( r% Z
                               
登录/注册后可看大图
        //设置Person元素的属性。& w, p; c* P7 n% Q# i

% }1 \& I; R% m8 D, `7 K- C9 d: P8 h# ?                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");. |: b. l$ ?3 e/ R7 U
/ _9 k2 ?' |! K! P2 _
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。' [' ?0 M' K* d" C9 _
% i# F" c6 G* P2 D0 n  }$ h# X& [
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");1 r/ M& R$ G8 P9 U. I1 V: w* W

/ G  y) g4 u* `+ O6 E4 S                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
" |* y/ G% i0 E' `
1 y$ Q. S% }" j' s0 n
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
9 W, s+ E+ G5 @) ~1 o

$ z$ L3 F/ V' S, p% C                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);/ M) l6 q7 U! y* M; [# u

& D5 W$ n% P0 ~# ~. g. q                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
0 D. K" t. _6 F: @- [, Z" T
/ m1 I0 r. z% p) n
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");9 ~1 E8 F, ^9 u6 T0 o' B  K

# r$ o9 c7 o) r; u1 H  V                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");7 q+ D5 v7 u  ^  Y, W# \
( m( p- }( _% P; Z
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);8 M# u  c9 o+ ^6 m2 D! u6 A. p% W
5 W5 l) {- S8 o# R* r, f
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);- [+ J& r5 N! i, i/ \: E

& H$ j- A2 y5 L5 B                               
登录/注册后可看大图
        CString appPath = GetAppPath();+ I9 |# T2 x. O' {9 {2 n& u, b

# u" X2 ]5 ~8 x- z& `4 w) R1 J8 c  e                               
登录/注册后可看大图
        string seperator = "\\";: C, K( o' L, Y# {. a, _

+ g* [' |9 [- V                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
1 D( A8 E. o5 r% q
' U) L, {- t2 {( E1 h; ?6 y  e6 ]
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件+ ]0 f7 J$ \; w) W5 Y' B/ m
: S# j4 v0 L2 e& D9 p# `
                               
登录/注册后可看大图
    }, b# b& A& u; N" L
$ p" @0 B  F% k0 q4 B
                               
登录/注册后可看大图
    catch (string& e)% L7 T8 S5 x/ Q* f+ ]9 K! q& t

7 G7 M; ?1 u* q/ E& M: i9 u1 l                               
登录/注册后可看大图
    {4 o3 }4 d6 M: B8 _" O
- p/ D3 ?9 i) e
                               
登录/注册后可看大图
        return false;
: L) o$ E' j5 `5 J$ r9 F
! d4 b3 y( N- y% D
                               
登录/注册后可看大图
    }
7 z$ ~, L& z* v9 ^3 a. m
* b8 Q) i7 N9 e' I# j) u
                               
登录/注册后可看大图
    return true;
+ }3 Q& [, I1 }
" m' u0 I+ n5 h) m- ?' ^4 \6 y2 Y' q
                               
登录/注册后可看大图
}
7 B: T" l6 m$ l7 d5 J
; b* b6 n; x& L( [" {: X
                               
登录/注册后可看大图

0 e( q- M5 ^* A+ M! ~% ]: _

1 m5 M0 v: V9 Q0 x                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)9 ]8 v& i  S. B7 U2 x: ?9 M+ c/ A
4 l) p2 E; H/ m$ w4 x% `4 y
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
1 ~& s9 p, R# e, S1 @. U

) L3 j4 J4 _" R0 t                               
登录/注册后可看大图
    try4 Q7 o; `( I- O; y# f8 _

& v- ]) r2 d+ e2 l5 I0 }8 ~# [8 N                               
登录/注册后可看大图
    {
3 A  M4 Z+ Y: X8 ?( \
! w  _, F  x6 p/ ^5 z2 F0 `
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
: N6 _2 T2 I) g2 @5 I3 {

# ?1 {' r% p7 p$ \3 s' X                               
登录/注册后可看大图
        string seperator = "\\";
; n, _9 X7 |$ p) V
0 a( Q5 p* }( W* r
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;2 I2 J9 e: E+ T# z6 }7 z" G

/ H9 L6 d2 K6 Q                               
登录/注册后可看大图
        //创建一个XML的文档对象。9 ?2 b5 F- `4 m5 b) M
# p! w) |7 v0 H6 r
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());) j7 h, E; G% m4 w) |0 S3 g

. V! e1 h6 W2 T3 M3 I: V- C8 C                               
登录/注册后可看大图
        myDocument->LoadFile();: ~" _& g5 H9 e" C
8 Q/ _4 e& I% {1 q* L, L
                               
登录/注册后可看大图
        //获得根元素,即Persons。5 V& [8 p0 l. A8 r! a* u- o

2 @8 \1 i8 v5 R, ~                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
7 K6 u7 j  s" g4 J* D

; {- `: l* F6 b% {                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。0 j5 Q+ r( r' p& [0 U
* M8 d) A3 W+ u) p9 @5 o0 B/ w& f/ ?
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;5 M, M: L8 t6 Q' h3 R

! N$ l/ M8 e4 ]* w: H                               
登录/注册后可看大图
        //获得第一个Person节点。
" x; q3 I* X" e# _' j* H

( n( J) @5 J7 Q4 ^# Y% P( @) H                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
3 F( p. |, |/ h0 a6 j- J2 j

  L9 \- s& K" b7 y) T                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。  f/ g9 [) A( z
; \9 L- Q/ P; n
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();  E( L" ?  ^* E/ K1 a
9 C' g" X# r6 u3 J6 v
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();4 `6 A+ M1 l1 i! O) A4 J! A* D: w" V
( Q0 s+ y1 B6 g
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();: t7 h$ Y& I( e6 v
9 [3 O1 l! U* x; Z- m, ~+ T% c6 \
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
0 K9 h5 i6 q" p+ q5 z

% N; y- Q! `# B3 t) @+ U  C                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
; X9 e+ C! N8 @1 Y5 x
! a9 T4 @( _' B8 K$ [/ ?; i5 M5 V
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;  f% n! S4 o3 C
: L2 p& J& O# L; x& f$ a
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;# j, y; t  f3 }9 N% W+ e$ M# I

, O9 x9 Z* q# t4 A                               
登录/注册后可看大图
    }
9 Q0 ?# H  h- P5 Z1 }4 `0 z

4 K+ q  R- Z; M3 E! F" W' g# ?+ S                               
登录/注册后可看大图
    catch (string& e)' [3 d7 \/ C& m4 n% D0 }. f$ \
! I4 V: c# `0 |2 F8 s' o4 a
                               
登录/注册后可看大图
    {
0 f2 Q2 {- v: R1 ^! R/ {

( _# m7 _' W/ b5 @# E' q5 @$ Z0 O                               
登录/注册后可看大图
        return false;! V- Z. @4 {3 f9 ^$ T
3 a+ I. `% K+ |# c5 e0 p
                               
登录/注册后可看大图
    }
: f) V' M& p; b' W  T0 i9 e
5 @- `' Y# Z1 R/ F" ^  j! v
                               
登录/注册后可看大图
    return true;, ?1 O' j# V' u+ r# K

' p" n4 [# |# f- [                               
登录/注册后可看大图
}, \( I! C9 k3 d2 K

$ e/ Y* {9 m& O# \) ]* S                               
登录/注册后可看大图
int main()
8 z( |: ?6 h  |/ J5 g- }

0 J7 X7 o7 N' b1 C$ X                               
登录/注册后可看大图
{
7 D& j; Y, w  d1 d. s9 _

. S. z( N0 {/ ^$ ~- s                               
登录/注册后可看大图
    string fileName = "info.xml";
  X) v! d3 F- r: `8 h3 G0 P( u! ~/ M
$ f& w. r/ T8 n  ^
                               
登录/注册后可看大图
    CreateXmlFile(fileName);' Q/ o% Z0 l9 [0 m) P( L
# X1 O- y3 B1 D8 |2 v! M4 b
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
+ c. u5 `& {6 S  n8 \! _
7 n# p; M1 S6 S3 p
                               
登录/注册后可看大图
}
- {' K1 J2 g! ~: y2 p5 ^& e
4 H8 j  a3 @( ^: x; s
                               
登录/注册后可看大图

4 f) [0 }& f, e; d, o$ \
. }$ n0 B6 K+ f% y  a) e2 S( i
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
: G$ {' f4 T9 B: E  J0 w6 W
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了