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 4178 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片段:1 X; k, W) c* H! K8 z1 f
! V$ L4 m7 g9 I$ @* S# u. t/ E6 b
                               
登录/注册后可看大图
   <Persons>' N9 o% m6 e+ ?- d/ h  o: ^

7 N- Y) a$ [8 h4 ]% C                               
登录/注册后可看大图
        <Person ID="1">6 P1 v3 K" O: T  _  L% E" n
9 C: C2 b0 ^7 @/ X. E
                               
登录/注册后可看大图
            <name>周星星</name>
. V1 [! L' ?" O% ]6 |. m
9 d  b% D* C; V6 f1 G  C+ r
                               
登录/注册后可看大图
            <age>20</age>
8 N3 {  M+ j  c& G1 b; M
! b$ ?( \: x  K
                               
登录/注册后可看大图
        </Person>
" J7 R2 t1 H4 p7 _& p; Q4 X3 B7 {

2 i0 Y% ^5 K7 \4 H0 s' u                               
登录/注册后可看大图
        <Person ID="2">
/ S% N( L2 [* ^6 g! X

% p5 I5 X1 `. o1 g4 p  z                               
登录/注册后可看大图
            <name>白晶晶</name>
0 K' {& ^" g/ E3 V! M
4 Z; l" O  D& w% I0 w+ p3 ]
                               
登录/注册后可看大图
            <age>18</age>
, o) y2 `: ]/ r  z4 y
' d. b4 n8 W* f
                               
登录/注册后可看大图
        </Person>( A8 l2 x: ?: j& k5 ]- o
0 X! l/ ^- Y9 U' P% a0 L& i7 |
                               
登录/注册后可看大图
    </Persons>
: M) B4 C  q( A: Y7 ?

. T* S( c% `9 W2 C                               
登录/注册后可看大图

; j# }& H/ l" W  n
在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文件:
  Z" p4 O: ?& s
8 n& e5 T% |4 b7 g( ]! l, o0 S: U& B. L
                               
登录/注册后可看大图
<Persons>4 M- q* w# U9 P8 Q# X& u* u
$ r4 u& F2 ~/ t- q- L8 ~
                               
登录/注册后可看大图
    <Person ID="1">
4 v" S; m8 h  O! }& O3 n

+ _( c) S# y, x& m6 i. `. L; F3 f2 V                               
登录/注册后可看大图
        <name>phinecos</name>2 F9 S" D. o3 J- |9 E8 e/ p
% f. q" [0 `, {) U+ _. o, Z
                               
登录/注册后可看大图
        <age>22</age>6 G& g2 A! m3 J; O9 v

$ N( D7 N* K, t$ g$ k( j3 B                               
登录/注册后可看大图
    </Person>
; w' {; x" w- N1 U
& K: r( U5 F* o
                               
登录/注册后可看大图
</Persons>
" }; i5 K0 a: x: A4 h8 \0 X& \2 C

7 U6 L) M$ C+ F                               
登录/注册后可看大图
2 p3 H& i/ U, I& L
读写XML文件的程序代码:
: w  y  L) t) _

; s: Z% Q, H% g4 ]. E3 q1 J8 m+ [                               
登录/注册后可看大图
#include <iostream># K4 G1 k# }3 v* Q' K; g
' s0 i, B1 o- q& v( i
                               
登录/注册后可看大图
#include "tinyxml.h"
  H( B9 g6 ~4 f3 H: N: ]/ u
6 i# @& J- w: Q
                               
登录/注册后可看大图
#include "tinystr.h"
" ]/ t) v! G7 |% }

6 @3 C& n9 c7 U! h% ~* U5 [1 r! N                               
登录/注册后可看大图
#include <string>: G+ R3 G# H  G/ v* P
2 X$ i. Z; [5 M/ g+ M: R1 f) l5 }; G& Q5 i
                               
登录/注册后可看大图
#include <windows.h>* }7 R" z2 j6 i+ `$ `8 u
2 m# Z, {* d1 U" m# n+ ~& U' j
                               
登录/注册后可看大图
#include <atlstr.h>7 ]1 C2 f6 N( Y, G2 t3 `& i

% T' _( |1 K& @6 i4 y                               
登录/注册后可看大图
using namespace std;  [- ^% J/ P3 H  C4 a

# T% H  X7 `+ x9 ]/ y+ p2 W- P2 l                               
登录/注册后可看大图
' W( K- T' N! t$ C4 C# r/ f
4 C$ y& P1 F: X
                               
登录/注册后可看大图
CString GetAppPath()
. E/ z1 S  h* W: R$ h
# Q/ \" V- ~  y2 R& P$ I
                               
登录/注册后可看大图
{//获取应用程序根目录4 c+ [3 F3 Z% w  B1 e8 }. {
1 Z1 P2 z# w/ X: M* o
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
2 C7 e8 t  s! `* }  M1 V
* e$ N' n# N9 [5 z
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
& ^  t9 n4 C$ S9 \( F

0 l1 O' h$ `0 U& R! ^# @5 |3 Q                               
登录/注册后可看大图
    CString strModulePath(modulePath);
$ R( m5 F1 A  J: E3 g* S! y
$ f( g# C+ B" T) V
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));9 R! D' }( B3 V. p
. d+ W  I: T; R+ O4 @  E
                               
登录/注册后可看大图
    return strModulePath;
& `- f; ?& x2 o
6 o4 w: b/ P  {1 x
                               
登录/注册后可看大图
}
$ M" t) f5 ?  [. F  n7 B
# C9 L8 q) J& T% X% i
                               
登录/注册后可看大图
+ [7 q2 w, p- V! H1 y$ j# @
1 a: h) t+ Y; P0 V$ }; a+ R" ?
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)$ N  C, [3 I3 f/ S" p' j

1 b. z, W9 N) q" p, K" K& [                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
4 t3 a6 |8 G3 L2 G* C* ]) |
5 E/ |' f3 r& ~2 z7 W# v
                               
登录/注册后可看大图
    try
+ p! t6 `+ l7 G8 U  R
$ n5 q) ?3 @4 x6 q! M/ X/ Y" i* F
                               
登录/注册后可看大图
    {! K+ a! I$ l$ d' z2 t
0 T+ Y% U# {* N; I" N
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
, `! G1 h/ s( S, n% y
0 Z" P; T) O( Z" y
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
" l2 V0 @5 }! u5 W
; |( v6 U0 @; s. ~* g
                               
登录/注册后可看大图
        //创建一个根元素并连接。
* n8 [! w  s& T
% G9 t4 F! b9 K
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
5 H* k# d4 e: P* D+ o
- A0 b; I8 }: C$ R6 s/ x8 x
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
7 B3 J6 L. O# R6 g  n

/ Y/ h) n4 a, ^9 g1 X                               
登录/注册后可看大图
        //创建一个Person元素并连接。: J5 l5 T7 {9 Z7 Y8 g% X

+ n+ L/ `6 j1 X9 O6 n% }                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
4 y9 K& f! c; b- o5 o$ |7 S( ?
6 v+ l7 y0 J1 r: Z5 t0 J5 q
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
( c9 _& q2 `' b8 j6 s, t! H5 k
3 M0 J+ j$ Y9 Q' t
                               
登录/注册后可看大图
        //设置Person元素的属性。
0 i' u! y  e$ F4 f
8 H6 n" k% q& \
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");1 @: Z% b+ f$ ]) B- U
* d  W7 ]% I' H# `
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
! G0 ~5 \& D9 a# q+ }
6 B( k6 Z, \& i: F' @( q
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");9 e7 C0 H# i/ o# q4 `# i
, Q& j) U2 p; Y
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");# t* U2 g( w6 g) W7 X

4 p7 s' k/ Z' S1 A) B                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);+ r+ ^# x2 s( j

) Q9 L% u- s- \  b: @* ~                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);% {# [4 }5 [* _7 v7 U" E& g
- ?; p2 r7 `9 @8 k/ }& Q' W
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。+ J" T: |) a9 b: D

# @1 X6 z0 u2 W% h" y: Q: R! U                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
: J' T( F! J) f- L+ p2 u
) s4 R4 X* g  I% V- j
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");. f% _; J5 g! n! W+ L, h
- K. T; ?# {6 w! C9 w: w
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);7 v! a3 O( j  {0 f" f5 P- B
' B7 p8 l/ E4 K* j- w9 F
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);  u+ W9 J. @  Z7 ^$ M& h3 L
8 D- {! C6 |" w
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
! N$ f( A! z0 t, K9 ^

4 j& U5 P6 S( y8 i  h                               
登录/注册后可看大图
        string seperator = "\\";
6 s" G+ q# E$ ?, k! ]% F/ [- Q

- R* j* Z; {. {/ E3 K                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;$ F5 c9 J6 Q- f( |8 }
; M" ?& n2 T2 r: b
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
6 U! x* y% r1 H* j# n; w8 ]
/ D6 @( T: a- h7 H7 X/ J5 H
                               
登录/注册后可看大图
    }
2 W2 {" n) `5 M. a

% Z" ~. u) a, ~$ u. M/ D                               
登录/注册后可看大图
    catch (string& e)+ h2 }' u- M/ B

# \) p3 X  Q( o. ~6 h                               
登录/注册后可看大图
    {3 ]. y" E' W/ T
- f- w# o3 U4 a  P
                               
登录/注册后可看大图
        return false;; W, i" p0 Y1 u. o

( i. Y  ~  F+ @" Y3 e6 m" @2 B- L                               
登录/注册后可看大图
    }% ~! I% M7 n& F7 |8 S( U. ?, I

. z1 A1 C/ l, B1 m5 n                               
登录/注册后可看大图
    return true;
. a4 Y, K; m- }  P

- f) d0 z. q$ [, I: Q5 I                               
登录/注册后可看大图
}
7 K4 ^' ?* Z7 P
- Z" M+ k* U9 i- U! k
                               
登录/注册后可看大图
  @( ]) B; z* G& Y
! Q2 [0 Z2 [' m" Y
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
* n& V- U6 }9 V' N5 E" y% }

. ?9 p& x6 I$ ]0 _- j1 @8 [- a8 g. E                               
登录/注册后可看大图
{//读取Xml文件,并遍历
. d9 s4 m9 G$ ~& ~! [% H! I
" n! G) K; q- {
                               
登录/注册后可看大图
    try
4 i% _& r( X( ]/ x9 f0 T3 y

# N: y) I5 e3 _2 y                               
登录/注册后可看大图
    {  P# f$ W8 x# a) e8 c

8 U% H6 O$ V9 M+ _; G* R, ?" y                               
登录/注册后可看大图
        CString appPath = GetAppPath();8 ?# f+ j. M( \! x8 _$ Y

) I+ F1 @, z8 h  g* \; H                               
登录/注册后可看大图
        string seperator = "\\";
' \6 W0 q9 `- ]& q. r/ e
" H4 g8 {/ c) P. `* ?
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
& u! s- t1 ]; a. T6 M7 k

0 X/ D& Y: H# W9 E- _* F9 g                               
登录/注册后可看大图
        //创建一个XML的文档对象。3 ~/ o0 G6 Z% e" c; t* [0 ?, g  R: e
5 z* L1 ?4 R4 ~+ g( E1 }+ {
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());6 z; s, [& W7 V- }  d7 N) l

: C. M1 x# C) V8 e5 Y& D2 j                               
登录/注册后可看大图
        myDocument->LoadFile();7 z& T0 }- J# i9 W* S- n6 Z
2 J1 I- W3 i: X1 u) ~1 J
                               
登录/注册后可看大图
        //获得根元素,即Persons。4 ^, i! r) l: Y5 i! j) a
  J7 y" J9 d* C- M% {# x, m
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
8 f. S$ @. \$ T* V+ O, m' Q
5 H$ }: y. \5 L/ T, M9 g
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
& Z5 ^! Z8 Q# B7 Z
% S7 D" x& q9 U% b* W4 |5 v# {# ?( k8 A4 M0 j
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
" _( m# C# f1 h
; q+ @1 K6 c# Q* S  n" Z7 P/ u
                               
登录/注册后可看大图
        //获得第一个Person节点。) F/ z. e1 P+ ]9 S# h/ N
: A1 v6 p8 M' \
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
8 g- V! m7 j% Z4 J/ G1 _
" J. W  ~1 `' G  h5 u% i
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。* f8 B5 [: t% g* Y, b3 C- W* \

8 m9 l- u, R# P' d                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();3 s% o5 B  g! a4 u! a! l# B0 w( N( ?
; P) k! Z  b( h* U
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
9 n2 M; M0 b. p3 ~$ Y* D: z
7 E6 ?, p* \; n  R1 P. L! w
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
# I/ o  w$ `: j  y8 Y) C4 \
( K8 e) c- [! I" @0 F. h
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
% M, D$ P/ K) L+ n
0 n( a- |1 u- y( t; \: P& X
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;) x) E+ x5 G* w& Q
) \9 K" ~1 R8 g( N! z  J9 w  G( N
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
" M. F, I9 G# g6 N( |3 y, B' S

& t6 e( |3 G% `1 b& F% g                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
* Y: |& M. [& S; A1 t
4 n' ^9 h7 _! ]# d- T
                               
登录/注册后可看大图
    }6 _' ^( f& p# i, z

7 l$ Q4 E' g( U                               
登录/注册后可看大图
    catch (string& e)
4 x4 e4 C3 Z) l$ s& F
+ C* n: X# o3 U5 s# F0 A, v
                               
登录/注册后可看大图
    {# N3 o, q7 t4 _4 |7 P

8 O) A7 s2 R* Z, c                               
登录/注册后可看大图
        return false;
; j( `0 V& }. c, E: n

9 u% i" h7 I/ |" g                               
登录/注册后可看大图
    }
5 A: @. o, T# ?' ^$ [

+ ?/ d. _' I( v1 Q! `                               
登录/注册后可看大图
    return true;
/ a; t/ e1 G, Q6 ?9 S) I- Z, h
$ k9 I7 [# P+ S
                               
登录/注册后可看大图
}
8 S, f5 q- }6 d% @4 s1 P$ L

- s: Y" s: a/ N' n- k4 I& j1 f3 Q                               
登录/注册后可看大图
int main()( c) v& L6 r6 }4 A/ \; }- |

- `: e1 W2 R, C8 H                               
登录/注册后可看大图
{
% B0 y+ [  l  a4 r3 ]5 `

- U6 p* j* D4 U) o                               
登录/注册后可看大图
    string fileName = "info.xml";
6 H: h7 k: {5 ~0 s6 J# J* R6 ^# r" Q
. x" b0 S; v9 f8 h4 B! w  p
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
" m& Z- ~8 V- {/ O+ `) U& w

; W  s4 G4 D! D$ w1 e, X                               
登录/注册后可看大图
    ReadXmlFile(fileName);
6 @; N( w! o! Y$ B- s; g7 p  ^4 }4 t
  m" V, }) b- V& q0 K
                               
登录/注册后可看大图
}
; N2 a' t! X9 P. [- A

0 V9 V- z1 Y! I1 i                               
登录/注册后可看大图

2 j5 ]) ?' X3 }" o  ?9 i$ k8 C" |3 H3 w0 q0 v+ _. m, }
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
6 x- _7 [' ?! J* m( J: e
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了