PLM之家PLMHome-工业软件与AI结合践行者

[转载电子书] 使用tinyxml插件来处理C++的xml读取和写入

[复制链接]

2015-1-29 19:28:56 4553 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片段:( d9 ?" g1 M4 c5 C& x
, f$ L) L7 x/ X1 R* I
                               
登录/注册后可看大图
   <Persons>
8 v- S# {; D6 k2 g4 S" s

8 H5 t. N4 e. C3 l2 C                               
登录/注册后可看大图
        <Person ID="1">6 M, m+ K' e/ x9 m! W
6 l% K6 D( C5 k$ y4 m; M7 i
                               
登录/注册后可看大图
            <name>周星星</name>
. d  G* i4 [2 N" G4 |' X6 f
4 C, o" B) X" b/ F
                               
登录/注册后可看大图
            <age>20</age>
8 y$ `: e& j$ Z* R
+ _3 {4 H' w5 j0 n7 R: T
                               
登录/注册后可看大图
        </Person>/ x& g* L. X3 c4 F
6 Y& c: R* s% I, d" K4 b& c* ?; I
                               
登录/注册后可看大图
        <Person ID="2">. i) D  n) G% f: Z$ j) s7 \: q
6 M3 }2 s& L; z
                               
登录/注册后可看大图
            <name>白晶晶</name>
& e: e$ l; Y. ?, ?, Y

, \, ?% A6 h( n                               
登录/注册后可看大图
            <age>18</age>
8 Y9 C' ?9 a( W  J$ l5 q" y! d1 b# u
2 ~: H1 v  [' K; G0 a
                               
登录/注册后可看大图
        </Person>7 y) L3 n6 _" c: M8 x4 Y7 z

  ^( d) Y- ~7 j7 I' f/ p, P! a# V5 [                               
登录/注册后可看大图
    </Persons>( p/ ]5 V/ h/ ^. _& C" E

# @  Y% f# r2 a, a# S* u6 i                               
登录/注册后可看大图
1 f1 l/ t+ ^3 L  f! ?
在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文件:
7 H6 d9 G. ]" L
7 J2 v$ H0 o9 z! t4 ^0 }- j" s/ s
                               
登录/注册后可看大图
<Persons>9 w7 q  Y1 ]% s: Q, O& w" f( \. `6 z
6 N, i# q; D, U# @8 A2 g1 Y
                               
登录/注册后可看大图
    <Person ID="1">1 A9 E, U: R3 w) {8 {" G

+ k. n. F6 ?  S+ ^                               
登录/注册后可看大图
        <name>phinecos</name>
9 D/ Y# O' W: M/ s  r* \

! w/ k/ S3 c# k. T4 Y) h) f4 s                               
登录/注册后可看大图
        <age>22</age>, q) c* p8 v( R! k- f5 O: L9 y

9 L. q5 K& D0 f+ q( q  l. U                               
登录/注册后可看大图
    </Person>; K- b8 G. X; q! x; o; i# k- C' o6 C

! |5 c, e$ h* F+ J5 o                               
登录/注册后可看大图
</Persons>% R! W) u. l! Y( Q, E3 k0 w; _! r/ u
9 o; b$ q9 M  |+ i
                               
登录/注册后可看大图

/ ^- U6 d- |) n0 E6 \3 W
读写XML文件的程序代码:
4 ?& X5 F9 E) z: ~/ R- c
# u+ W  f  M- ?$ ^/ j
                               
登录/注册后可看大图
#include <iostream># K$ i, r, s) J$ t6 K! E3 [

0 p1 r' ~6 u! f$ A                               
登录/注册后可看大图
#include "tinyxml.h"( Y. u: o, V* y! P9 b: q, E

( f2 R9 [! n2 p+ ~* m* h                               
登录/注册后可看大图
#include "tinystr.h"6 ?0 O! ?3 O  o% K

+ k- b; ~  ?; a: a1 A5 K                               
登录/注册后可看大图
#include <string>
9 a. M, q' S1 f+ e: K+ v" T  q

: I5 k( ]7 ~1 @& Z0 l* r7 G                               
登录/注册后可看大图
#include <windows.h>
3 R- q( I' ^2 \( X
3 G8 ~# ^; D  ~$ O: k
                               
登录/注册后可看大图
#include <atlstr.h>9 ~  n, D2 s# D6 f) k

' e. b* T4 D' n0 x                               
登录/注册后可看大图
using namespace std;
6 X8 Q; p, a- {7 A
: v' B9 s4 V# n) @( M. i; P
                               
登录/注册后可看大图

. o- y, u* c5 i  D" p: K3 l
9 Z' `( S5 v5 ]- W. O
                               
登录/注册后可看大图
CString GetAppPath()
4 q( l( T; H2 O0 U
% x6 p( b) I1 ~3 {
                               
登录/注册后可看大图
{//获取应用程序根目录
  N0 q4 o3 k3 x5 x: Q5 B% d7 U* I
$ j% ~( {7 u3 o% Q  i/ Z
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];8 B6 V0 P3 k2 r/ [! O) S5 G( \

9 |2 R9 u) x0 r; W0 V- k% e                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);* y1 ]  V2 s) m/ l; S# v3 s4 a
$ d. A& X. e1 g
                               
登录/注册后可看大图
    CString strModulePath(modulePath);% U+ c; m$ G& {1 j  }

/ E/ u6 ?3 H9 {# }: R) _7 @/ K                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
* v8 w' @7 O( V. Z" H; O* ?
" P! o2 D, _! `( o- a
                               
登录/注册后可看大图
    return strModulePath;
; y2 Z/ T$ |( {2 b+ `( w& U

9 s( e9 y4 `4 z                               
登录/注册后可看大图
}4 L3 M. t. a- F, U1 f- N
7 `7 \* A, I  h
                               
登录/注册后可看大图
$ q8 C4 X9 V+ ^+ K; m/ _

: n7 `5 z+ T5 k6 m- X  L                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)( Q- Q3 D/ b) n8 x5 G( p

1 J# Z: Q6 L, Z% Z3 b                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
' U. O# \+ H: a. J. B

) I* D- v! n: R- I5 W5 b3 \                               
登录/注册后可看大图
    try7 r. M# `6 b3 Y/ u* r1 h+ U- E7 O& ~

' N4 T+ Y" N2 a0 Z( ?. ^                               
登录/注册后可看大图
    {
* F" X/ ~+ m2 l1 w" A5 [
  _7 R( E% w3 u( X, r( u+ V
                               
登录/注册后可看大图
        //创建一个XML的文档对象。% ^! |6 _) B$ T, C  p% J

5 Z. @7 T9 o0 Q; v( h7 y- S) Z  I; `                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
: L; p1 @# \8 r8 c0 ?
. p6 h; T- z. F$ i" ~% _: ]" D& x; {
                               
登录/注册后可看大图
        //创建一个根元素并连接。% F' l( D( V, L& L
! `/ g, z5 n& y6 I* Y2 {$ a
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
, X+ [# U" i2 L2 A

7 V1 S: o- J. W                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
  r! X8 z" |( c: Y

" r$ k, d9 k6 ?' t" w                               
登录/注册后可看大图
        //创建一个Person元素并连接。1 M) e: k6 N3 M# ?$ d8 ~* ~
  W, S6 O% R& y" L; E) [5 W/ S
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
8 C2 C4 g2 c( G" p4 `8 F1 C
6 [$ f3 F5 T# L9 n
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);2 e: i9 k, |0 [6 [# w
: B9 u4 i* }9 K2 Q6 p6 h
                               
登录/注册后可看大图
        //设置Person元素的属性。7 V5 n" b7 P, V
5 x( w/ G2 O% T  V7 V  D: G  p9 E
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");: R( z! {/ y6 N' S& s% u- b
2 W" ~, X2 J. r, W' F3 h
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。: x9 l0 r3 L# O2 J

" u. Q: W( T, M# r, v& h( D4 C                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");0 {+ R- X" ?, Q. o4 W1 b# ~# S( {

' O8 G& `+ |, B. ~6 g                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
. A( R1 W9 m' d4 Y/ z

' @# n0 p( I: n# _% d0 _                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
+ V' X9 W9 s3 f2 \0 o8 ^

* p9 @, G4 O" C                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);5 u/ ~. e7 K1 T& q$ p: F
+ b* T7 i" f* b
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
: [7 g* l. s' ?2 h3 G) s! }

# Z* G3 h8 O  l0 N) J% R                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
) C2 m% S  q0 E# T
' A2 y+ K( \) o: T& \/ M
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
; e9 T  Y2 P0 Z' k; C

- q& Y) W: o& ^$ p2 M: Z                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
8 v7 C' G; i4 B) U7 H5 o* K% V4 d
7 J6 c7 {6 L9 m# Z6 a9 V
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
& `9 r+ z6 B" a6 s; u
7 j& V- Q0 y+ ^- i! L  D
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
! N( M. n4 W* O) E/ N; g3 x/ z+ E

9 S$ n! u- G9 B3 E. n4 s  h                               
登录/注册后可看大图
        string seperator = "\\";
4 Q& I2 T# q7 w! A( k5 ?( f
, ^! g! X) q6 I! e/ G& z4 A
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
5 I. r1 a! h5 `5 e) Z7 g2 }7 P1 ]

& ^2 j: A( Z$ t& E: Q                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
  w. u; O' W/ q1 R
, n6 N/ [; a9 {/ c" l! ~
                               
登录/注册后可看大图
    }$ E" s6 u' O3 z- H2 `4 y8 ~
' }% h3 [9 o7 ?1 M
                               
登录/注册后可看大图
    catch (string& e)
- M5 S! n, s% I  s4 J0 ~3 M
. o' b& s! U5 c: H0 V
                               
登录/注册后可看大图
    {6 R0 M& [" P4 A8 b% u, }

& X% r  K9 k7 a. ~( u8 ?) }                               
登录/注册后可看大图
        return false;
" o% L- ^' n4 {$ J  M
/ m$ j- R( }# ]5 [8 P
                               
登录/注册后可看大图
    }
; |9 g* j4 ?# T& l$ g
+ f/ n* x5 f, f1 P( {* A
                               
登录/注册后可看大图
    return true;0 [7 W* U1 ^& u9 K4 H) O7 o

! j' w; O" n7 T/ `3 I                               
登录/注册后可看大图
}5 R! E" }$ `2 ^: U: p

" f+ x- D- }) c  G                               
登录/注册后可看大图
1 Q+ l, n1 Y$ j. H$ D6 t1 D+ I, q

. z" F( n5 }; g  ^& c* q                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)  N9 u& `9 ]7 j" f3 s4 H, r
8 Y4 ^$ Y3 h! y/ y
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
! ~# z5 |9 t6 }; o- a7 v8 v
! v: m+ t8 x/ I: V: \
                               
登录/注册后可看大图
    try
: l! M1 y0 T. e3 z+ M& C( h5 r

% t  I& I8 K: }6 D+ D+ o                               
登录/注册后可看大图
    {3 |8 ~+ @9 \' g/ |
: j6 s2 o3 I3 u& ]
                               
登录/注册后可看大图
        CString appPath = GetAppPath();  q6 e# p( O2 k/ p  R

  B  B5 @' }) ~. c, o% W3 O9 \                               
登录/注册后可看大图
        string seperator = "\\";
; k4 U- K5 c4 |9 Q$ m  m
3 h5 i+ i& Z# w1 O# k6 N+ m9 T  k
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;: f, x' g: V7 b3 X* V

: `% ]; ~  J( P# ]; k; E4 l                               
登录/注册后可看大图
        //创建一个XML的文档对象。
/ x+ Z: a! d6 Q! M' p1 z) V

6 Z& ?; N# T/ K& X7 L6 E; J                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
3 Q' M- H$ Q. X! y5 R9 }
) p" z  ~, Q" b7 ?' i
                               
登录/注册后可看大图
        myDocument->LoadFile();
6 a" ^. b9 d5 x( s

* p4 y" ]: T" @8 c) P3 w                               
登录/注册后可看大图
        //获得根元素,即Persons。
7 j, R! A: G( j

# O8 r3 |1 n" w8 b, [4 @' i                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
, l; z; ~9 r9 X/ _) e1 K$ }2 ?

) g2 l, ^8 G& [4 W, p                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。2 Y- X5 \" j1 D2 o5 x$ p& w

; F) s1 I' W& g" H( M& k. y! N& O: g& z                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
8 w, Y9 N( w5 {% B7 m

# N4 }1 T3 B  Y- ~: D- |                               
登录/注册后可看大图
        //获得第一个Person节点。' i. g1 v4 w2 M/ K& M) b1 l
6 R6 `  x( t$ T3 i+ P8 N  Q+ Q
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();8 n! Y) f. `" _$ r( @4 |

5 [& a2 c! H  ?* h7 Z4 w: j- a% O0 N$ @, U                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
! g% g% Z5 o$ f3 w8 M' n

( u/ t/ [# k0 K: o                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
' h- V. l3 m! j7 K6 Y

4 G5 k+ `9 h. I& O8 Z6 W                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
6 |# Q. ~) G1 {, u- o" R
& L- C+ O" O$ V% R
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();0 C' Y5 J" ^: ^( I

) ]9 L9 L' ^2 _3 S$ e* Q* f4 e                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。1 ?) w4 [1 l$ v9 `. U, k8 z% E
+ {* X" u+ L4 D( T- T" N
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;0 I7 f3 E9 _, ]0 b9 d
- q/ F0 M. g' i( n: `0 ?( b: V
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;0 N. Z7 q3 W  \) R+ z
% u& p, ^, W  _' |8 C# v' ]# M, d6 ]
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
. q, J$ w: W" P. {1 O

6 ^8 |+ @7 N4 \4 @6 E* j8 t9 g' z; }                               
登录/注册后可看大图
    }
* i  k' S6 D- \

: Z  j0 u  w2 Z, k* m/ w  A                               
登录/注册后可看大图
    catch (string& e)
9 H' S* Z) o! U% P
4 |  O/ ?. w$ d6 D" S4 Y
                               
登录/注册后可看大图
    {
+ D( U4 u6 e$ ?* Q5 i- Q! R

$ @+ E" {4 Y/ G' [$ ]+ U                               
登录/注册后可看大图
        return false;1 s0 T0 a: }; y& J
' E% ^3 ?* ]' z" \" f, B8 r+ c+ t6 h1 b
                               
登录/注册后可看大图
    }
8 _2 c. O/ R4 U) N2 J

& Z5 @# l+ v% @+ f: ?9 i, X                               
登录/注册后可看大图
    return true;
( B9 ^, y  y% B# ]1 F( J
% O6 X/ m, k1 _1 U+ A+ ^
                               
登录/注册后可看大图
}
% W8 K5 h3 Q# j' e
) ^6 [/ q& _% M1 w" y
                               
登录/注册后可看大图
int main()0 R, G. G' |/ x# l% M# Q. b

, @0 S+ e5 Y- {' F. t* n, g                               
登录/注册后可看大图
{1 t8 @' a6 }5 n2 e
% _; J. J8 X9 S4 v$ P* J
                               
登录/注册后可看大图
    string fileName = "info.xml";8 y# j7 Y( |0 d7 h7 U

8 e9 d+ [% G* M. f. Y6 h                               
登录/注册后可看大图
    CreateXmlFile(fileName);
! |( T/ i; |7 W# c
' ?2 u& T! R5 N* w7 {
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
( B$ `% s) L4 N) B: C# e
& Z5 o2 @7 L) w8 d* r! f$ j% z
                               
登录/注册后可看大图
}
/ C; F4 W  b8 p9 S! d
# y  I7 Q% E: z9 N, X
                               
登录/注册后可看大图
% C$ M2 |' }4 y. B
3 s& a- X! x0 c% ~0 L. \/ ]
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  - s3 b( f6 i: S! I: Y
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了