PLM之家PLMHome-工业软件践行者

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

[复制链接]

2015-1-29 19:28:56 4521 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片段:' g9 V) m1 d8 O0 X
' M% v7 K1 }- @; t: K. I$ W
                               
登录/注册后可看大图
   <Persons>
0 m! g7 |3 J# g/ J) {7 a+ H
5 x5 l# _; c- H4 O* M/ \9 L4 V
                               
登录/注册后可看大图
        <Person ID="1">
2 O5 Q. G+ x8 j0 ]  O$ h( N9 h1 m
( v4 B8 B  d$ ~3 |
                               
登录/注册后可看大图
            <name>周星星</name>
8 b. Y3 w4 g. |4 ~; `2 k/ M1 u" ?

; b+ d4 ]( z0 Z8 v2 T6 d                               
登录/注册后可看大图
            <age>20</age>! L) E; ]+ p7 I& M. w
1 P$ |% W) }6 N# b
                               
登录/注册后可看大图
        </Person>/ p! D9 s; r, a/ F; F  \

% |6 K" E* ~2 H/ `8 H5 N                               
登录/注册后可看大图
        <Person ID="2">
" V; |; ^8 n4 q, p& e- ~' d

, @0 l# e6 R& E" A8 x/ n6 e7 p/ ~# Q0 ~                               
登录/注册后可看大图
            <name>白晶晶</name>
  t* z% G7 k9 }' J5 ]/ q) N

' V  `6 H0 u. }1 l8 q                               
登录/注册后可看大图
            <age>18</age>
3 B$ p" t& o0 y

  C6 ]2 h+ c( Z( ]7 F                               
登录/注册后可看大图
        </Person>$ i6 _5 l0 n" O8 L

3 D/ e! Z8 E. n8 }                               
登录/注册后可看大图
    </Persons>
4 [1 h: W9 i6 w( m: Y

) x' Y2 n  u) |) Z1 u                               
登录/注册后可看大图
, |3 z8 Q9 }+ W/ w4 `" C8 o7 p
在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 w' E% G% q$ ?2 P

6 V6 Y: n3 w" y" t6 `                               
登录/注册后可看大图
<Persons>
. x/ L  }- r; G9 {! a0 z' k
5 @2 n: M' I9 S6 d
                               
登录/注册后可看大图
    <Person ID="1">
5 l6 m1 R* ^! _4 u7 y
# f" i8 E$ f& I2 e$ p
                               
登录/注册后可看大图
        <name>phinecos</name>
0 Y" n$ d9 c9 y8 i$ l' T' p
9 U$ N9 D7 X2 O
                               
登录/注册后可看大图
        <age>22</age>
) W3 }& _2 w3 k! c8 m! X, E
- I  t( \2 j; `' I
                               
登录/注册后可看大图
    </Person>
, r* y# P) V5 r% s1 H( W0 M" C+ N9 i- {
9 n: ^7 W6 X  H/ H( f
                               
登录/注册后可看大图
</Persons>( Q: {& `2 x9 c7 `; ]
' V% P1 C: x: ?/ Z4 \$ s) h
                               
登录/注册后可看大图

# s( E6 \. Y# e
读写XML文件的程序代码:
. p# r  o" G' }$ t& Q& r
% \% T6 \: `8 w& T( E
                               
登录/注册后可看大图
#include <iostream>
7 ]& a7 |$ C, @0 G7 x6 j' K

+ N/ p, h) Z' S                               
登录/注册后可看大图
#include "tinyxml.h"
. f: y* L! x. e3 _& q

" K- h3 V- Q9 {' F& ~7 c$ k$ ?/ h& Q; C                               
登录/注册后可看大图
#include "tinystr.h"
5 w9 `3 L' @2 b6 B; t" w5 G

) q& T9 @' l' K- O; R8 u/ Z" l                               
登录/注册后可看大图
#include <string>
. @$ p- @- I/ l8 |
- E+ s: V4 C5 o: [6 d/ Z# ?1 M
                               
登录/注册后可看大图
#include <windows.h>6 M# ?  Y6 V1 r: [
' ~( _( S) c; {, |5 w5 X
                               
登录/注册后可看大图
#include <atlstr.h>
6 T& a' N7 _3 B3 \6 \7 g
! D) s; d; a2 a6 I5 s( f: Q
                               
登录/注册后可看大图
using namespace std;
* x: D4 e0 `, g

, l; f; ?9 m. I2 ^  C                               
登录/注册后可看大图

/ C  p2 X7 M6 e8 ^3 E- L; h4 x
  ?3 t* A, r) N! V, ~
                               
登录/注册后可看大图
CString GetAppPath()5 V5 z& ?, W! A, g6 N
, {8 u9 P  B5 e+ p  `  f8 q
                               
登录/注册后可看大图
{//获取应用程序根目录6 w  s5 K% B' H; P' U
' x% S! p% r4 S! g: r# k5 h
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];5 A! m4 z; q  B; H' q' D
* e8 W# O4 M) l' P
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
6 d5 ]. O# u. d( K! i0 l, Y% |' S# M
# K# a! Z( Z  P9 n
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
& F' w2 H" \$ {. O( W3 l  y

* E6 h+ E6 l7 e  O* [                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
5 n, L2 Q# o8 a! Y

7 H! i9 n! p( U6 l& u+ {                               
登录/注册后可看大图
    return strModulePath;
) A# G- O: l  w2 B
2 D8 r2 @" M7 G$ }, W
                               
登录/注册后可看大图
}0 p# |6 I8 x: W
- o$ Z6 Q2 H7 @- w! p
                               
登录/注册后可看大图

& p, \; X1 H) C4 X2 J& r4 h
. |. i! B8 u- G3 q' x) X
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
2 i) `+ |' Z" f5 J/ w

" {/ R' R% R( n9 r9 |                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false- H6 u* }# Z2 y3 K7 B" c

/ M$ q6 x$ F) ^; Z& {                               
登录/注册后可看大图
    try
8 ~& I* q9 }; h+ l0 q, z

, `4 f8 M! w' d4 n5 O3 _                               
登录/注册后可看大图
    {
  g& A9 f* c8 N  o
$ D( |) i; L+ Y! @5 `$ p
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
6 ~! W1 N( P3 h: s
! n1 K' v) M9 `: {( U
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
" Y7 n/ e. ~& r4 d! _! e

4 d$ N1 C* D5 I                               
登录/注册后可看大图
        //创建一个根元素并连接。
% n* N5 @, u3 |' u7 i

) P8 Z4 a: E" n                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");( |. t/ e, L" L% ?  O2 X- l
  ?" P6 v3 Y" [# W0 T! x
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);) [; a  C' r4 P5 r: b1 Y- z8 W" }, J

# a- m1 p  u, X, d5 a                               
登录/注册后可看大图
        //创建一个Person元素并连接。
; Y) n* V9 O9 M2 ]  y
2 |8 M2 G0 F9 @& b. x
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
2 |$ w: j* K& _5 R+ r

- x( G- R8 K$ m" K: ~                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);& R* C5 c& c* I2 |2 i  T- ^/ d

. J8 k. Y- U: E1 ?: Q6 U& b                               
登录/注册后可看大图
        //设置Person元素的属性。
* A/ |; R  p  ?2 }2 f

" j; Z$ A8 g: }, q                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
# B9 g* E- {1 {# K

& W( V8 _# D3 ?7 W1 W7 t$ O                               
登录/注册后可看大图
        //创建name元素、age元素并连接。8 Q1 M1 u) r3 _6 s3 N! W& i- J

  c$ s! c' \, ^                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
0 J0 F" P$ E& f8 ]; a
6 \8 m# w. F" U  ?
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
; N, u# I* t( }, R# Z

+ ]' m" z1 ?7 ~9 H8 f! }1 b                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
& h: r" G2 H; `' Y1 i

  |! {5 R5 x6 O: {/ t' A! X. c                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
' I4 B$ |; a+ s
5 m9 ~" U- j% k7 V3 V2 m
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
. g8 P; f: y( a0 _0 C2 R
" z$ q( v; _+ V# p0 k6 ]6 s0 T
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
  v. X5 h5 d9 k6 e2 t6 Q
- ^3 o  O# T: T9 j8 b2 ~) Z
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");5 e" V' B& m& l2 P6 w) B
5 `" M; L0 m; ?- p0 l
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
0 g# E$ h8 g2 \- j; E; m1 {
7 ^! z# E  b) u: K5 T( h
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
9 `. Q" [* T! e
4 [8 d* k% T6 [' |
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
. M/ B' v' a' Q! z4 c

) o. c5 y+ z" b+ k$ r5 X                               
登录/注册后可看大图
        string seperator = "\\";- ]* @/ q0 j. O" ]

" H1 F& U. ?+ @9 z. N                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;9 F8 e" x  ^6 K4 c

. ?" x- F; |+ `" m6 q' ~                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
. T' G8 ~' _& m! c: y3 u, C

& b* k' t/ H7 G/ `5 y                               
登录/注册后可看大图
    }9 l! u" h0 f8 x7 ]1 n
, J8 T5 y- J* S7 X8 g/ W
                               
登录/注册后可看大图
    catch (string& e)
+ k- d/ M5 K& ?- M+ \& F4 O

$ d0 \$ f# h" T( }8 u. F                               
登录/注册后可看大图
    {
& y4 M; I$ m: r* z* j9 x

0 B' L2 H$ ~$ S! [! C                               
登录/注册后可看大图
        return false;; O3 t7 _3 q  e8 P8 ?
0 ?2 Y' A0 y8 U5 x' b; s
                               
登录/注册后可看大图
    }
) R! w8 S' K5 p8 U

0 ?: i; e7 R2 n$ {                               
登录/注册后可看大图
    return true;
9 P8 c5 |4 I. a$ o: I% O

5 i4 |4 E3 M, Y. w/ t% t9 C                               
登录/注册后可看大图
}& B# D7 d. x* F# ]$ i

' T" e6 B4 C# W1 J/ i1 F                               
登录/注册后可看大图
% o; a( m, s* Y) ^
! J. E% ]" {1 B* {' M" ]
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)% x: ~& r4 h% B: O! ]/ X3 J
# k5 k# g8 i4 L7 H8 @
                               
登录/注册后可看大图
{//读取Xml文件,并遍历; R0 _8 ]8 k1 n# A7 n! }+ \

" [- Z- Q/ {# D" L  N6 e                               
登录/注册后可看大图
    try# f, F/ {% d$ ^$ F* \" b" {  Y( d
) e3 j* w8 @/ Q! i* ?1 q/ w
                               
登录/注册后可看大图
    {' w% v% K% A2 \( c% U9 a# P3 }

& f$ _. M; W6 X                               
登录/注册后可看大图
        CString appPath = GetAppPath();
2 _  n  ?, [; p; ^4 g4 z3 T
) f; ^8 e7 g6 a
                               
登录/注册后可看大图
        string seperator = "\\";2 Z4 }4 d1 |. c/ Z7 g! ]4 _$ ~
( B1 N; z- E  O( R# l
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;2 g+ t8 [; x# `( x
+ u" S, q  X5 c
                               
登录/注册后可看大图
        //创建一个XML的文档对象。6 K/ x: V7 F9 t& u! \) f

' j+ v; ^4 ?5 P* a                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
& c; l, }' T/ G3 ^4 ]' [: m
$ I; b: u! I# q% i1 v
                               
登录/注册后可看大图
        myDocument->LoadFile();) O; p# p! L3 }+ \& c/ K
: Z. |) ?' v; u% S
                               
登录/注册后可看大图
        //获得根元素,即Persons。* O. D4 q+ @5 b2 E; N

4 Y; a$ K; n6 V& p* ~0 e- M/ d5 u                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();3 x% |8 G4 e, l9 z3 @

5 ?; {+ S9 }9 J2 U6 L& k                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
; H$ F8 p3 n! _4 l& _% }. |1 r% f

( u' E, M  l. X                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;4 [/ _2 u% e! ^% b) g$ P/ Q
1 q" R: \  Z; v
                               
登录/注册后可看大图
        //获得第一个Person节点。
0 t. m! E/ i8 c  Y* `8 y* S1 s
; [+ }+ ^4 H, K- s
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();$ @" o! E, C6 ?6 ^' j# b5 l+ P

) H* N" ]3 O$ Y% m! Z, u' y% @; {6 e                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
2 z- ]6 J: E4 P+ x
. v+ \- s9 N' q6 s" t. G
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();# y6 C. X# v$ m
( l4 |: \7 R7 u: t/ P; |4 V
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
/ Z7 X0 J1 w  @$ B! x" h! ]) `

. Q. p, ?& E& R; N+ P" [: `                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();% M$ c& [% q% @6 q
" {' z& ~7 {2 I5 n0 }7 p* N. m2 o  B
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。- n4 n( s3 p5 K4 z& f3 P
5 \4 i0 O) D7 N4 y- Z4 ?
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
* K% J+ G, @8 h1 N' Z

( d8 _* t" z0 Q/ X) M                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
+ b8 P( w4 Y# c9 _
6 b) e- f$ e6 p+ r/ x% ]
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
/ K3 i, b/ [! d: M% ]

  I  f; O1 f5 d1 b2 o                               
登录/注册后可看大图
    }
1 {$ T- O" O0 V  H( G1 J8 r
& o5 c# |, W3 V: e, p& q* p4 P9 Q
                               
登录/注册后可看大图
    catch (string& e)$ G) u- Q4 l  `: R: f: R
4 ?$ h$ c. Z: p' y4 r; g) B
                               
登录/注册后可看大图
    {4 s7 K3 x+ B" b- X

9 `9 I4 i0 T% b8 J( ^8 n2 q9 J                               
登录/注册后可看大图
        return false;
! _8 j9 {+ s. M! X4 X
' a3 Z$ H1 W) G- N+ P2 Q6 v0 y
                               
登录/注册后可看大图
    }
( c% n' d6 n4 b% r5 Q$ q# W+ y
$ g9 [& \. ]! d+ g5 y1 K+ _
                               
登录/注册后可看大图
    return true;
5 D( E. z1 n, V

) G" b7 d+ t2 K  {" o! X  _                               
登录/注册后可看大图
}$ c1 n2 b. F7 ?8 A# @

" r( J# P# f6 r2 {0 W& @/ Q1 C: f                               
登录/注册后可看大图
int main()
1 s! ?2 I! J6 _! x$ d
8 U) ^" G: G* w" @3 y0 X& M
                               
登录/注册后可看大图
{
" B" T$ a! e5 t! p( G0 Z# ^1 ~6 a* j

. o5 x& p9 a! ^. l* h# P0 F                               
登录/注册后可看大图
    string fileName = "info.xml";
) h' y% Y2 k. i% ~
5 L% f6 p4 a0 I& f
                               
登录/注册后可看大图
    CreateXmlFile(fileName);, h% P, l+ x5 m3 T# c

, x1 B9 l, r/ p                               
登录/注册后可看大图
    ReadXmlFile(fileName);
) h6 X) c' z, n  r; O' i
) \9 W; o/ k* Q$ N
                               
登录/注册后可看大图
}
; J/ I0 |# B, o4 X% T6 e% V- k
$ q5 b, j# T9 d( b8 z$ g
                               
登录/注册后可看大图

  U# n# |3 m) J8 A- k! C/ V- P# o- A( T! ~- h& s/ f
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
& X; ~, S5 w, e& Q0 P
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了