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

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

[复制链接]

2015-1-29 19:28:56 4564 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片段:! q1 e; X9 ]- \" E& u
! O- k8 b8 U: X8 u' a
                               
登录/注册后可看大图
   <Persons>& b3 U$ g( R- ~# \2 L

7 A# D' y3 K- B2 x# p                               
登录/注册后可看大图
        <Person ID="1">
5 i8 v1 e3 i; `( r
$ b3 ?  }3 T2 D3 W8 v, h
                               
登录/注册后可看大图
            <name>周星星</name>
  F6 ?; s3 d; `+ L1 H2 w

; P9 [# c0 Z; F5 `! t                               
登录/注册后可看大图
            <age>20</age>; ]5 a2 U* x& g$ |+ E

/ ~( f# ~8 w+ v) h' Y                               
登录/注册后可看大图
        </Person>
& Q1 u/ c1 x1 {; |$ B' _8 E
: U) F1 C! z" v2 q
                               
登录/注册后可看大图
        <Person ID="2">
; e( v% d* L5 C! m. N$ O* \
0 A1 ?, S% M3 x' x6 `
                               
登录/注册后可看大图
            <name>白晶晶</name>
6 g5 o9 ~; B9 K0 ^( G  D% o

2 }: s- t$ J) e) J3 m$ X                               
登录/注册后可看大图
            <age>18</age>
7 f" r7 T. d! z4 S
2 P0 a' C6 ~! d$ X
                               
登录/注册后可看大图
        </Person>4 U( M( w8 [  e6 u7 o# f3 o
2 G# d& h- y2 S/ B, k6 Y2 Z4 u
                               
登录/注册后可看大图
    </Persons>% t" s6 u. [' k8 N( M5 O
5 T8 h+ N3 h; V/ W8 ^+ f
                               
登录/注册后可看大图
) R4 A- u! o: d5 n" 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文件:0 r" ~( _; Q9 `. T+ R* |4 k: Q
) {) D/ y1 b* ?. i7 U0 N6 I
                               
登录/注册后可看大图
<Persons>: i* g7 {9 B1 b" M* P
0 H2 l, q8 D  a0 M: ]- g1 d
                               
登录/注册后可看大图
    <Person ID="1">8 P- i# a! \6 H  z, I, E
4 F& _) N0 e* s# ?- g7 N
                               
登录/注册后可看大图
        <name>phinecos</name>
- q- x% X3 x5 l

7 a( ^% f8 q3 ]* G5 R5 K                               
登录/注册后可看大图
        <age>22</age>1 Q% i" b2 `" i4 Q: u
+ F" n1 H$ C! w" l& [1 Q6 @
                               
登录/注册后可看大图
    </Person>3 `0 }. V, O! \0 h

: A$ H  Y2 ^( Y; O1 k- ^. U  x4 W7 Q                               
登录/注册后可看大图
</Persons>
& Y8 D7 m5 R) j! Y# ^$ d+ j
3 N' V7 o& F7 }+ y0 U
                               
登录/注册后可看大图

( v6 u0 [! w, h! x/ w2 s
读写XML文件的程序代码:5 `+ X! }% \! q. Y& @
( U2 Y6 u9 U  p) T* A+ T  y5 b
                               
登录/注册后可看大图
#include <iostream>- Z3 c6 z4 I6 K. Q) |# g( S  Q2 x6 R
& Y9 @5 x2 u' a
                               
登录/注册后可看大图
#include "tinyxml.h"
/ x! o# M1 p- p  Q0 B
4 E+ S* O; c: ?
                               
登录/注册后可看大图
#include "tinystr.h"2 W' f0 K2 D2 J: R* t# v
: v+ n& C7 h! N
                               
登录/注册后可看大图
#include <string>) _* Y) M% @# @
& P: I) p" {8 h# `1 H# i. U
                               
登录/注册后可看大图
#include <windows.h>
/ }& L% E- i6 |" a

1 }! h- Y6 Q' \% P                               
登录/注册后可看大图
#include <atlstr.h>
' q2 j- q% g* a' `* d( n

  |. Q1 p. ^# v" ~5 j$ Y                               
登录/注册后可看大图
using namespace std;# d# B! A$ C8 ]" j9 d

& y0 g# ?: I! f3 x# [. c# J                               
登录/注册后可看大图
7 R! }7 N1 A3 {6 H" T+ U0 r

$ h' p" t- X. m" Q                               
登录/注册后可看大图
CString GetAppPath()% ]6 J) q" |% Y' q  ~& m  O, ^
# H" Y, C( z" Q4 f5 l, ~' N) N
                               
登录/注册后可看大图
{//获取应用程序根目录3 |. @- r2 |9 d1 a- x" B4 ]2 E

8 f  c% J' |, a3 `1 n  U: @$ C: [                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];( ~. c* y) _/ p, s0 P3 e% L, d
9 r4 q! l  P4 d/ V( f
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
5 J; N  h+ u" n! U" M1 q- v
" M0 A  a. {4 |( e! O9 r
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
2 Q9 g' r# }& h. r- e- V

, b. B/ a6 b: G: E4 J& _; e3 b                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
+ k0 I4 _2 q' z0 T7 N+ s

+ r9 K( M. Q- b0 w                               
登录/注册后可看大图
    return strModulePath;
: y/ J$ _) k) s6 Y7 z* o& l
/ _8 h# g" ?' ~2 \* V
                               
登录/注册后可看大图
}
2 a5 x$ ^; S, m3 Z; P# @

+ E4 @' n7 g- a9 y+ z" v                               
登录/注册后可看大图
4 g4 ?( D8 }! N+ t( F, T

: c2 M2 g8 _- _8 U  Y  w1 E* S/ S3 y                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
- F( N+ I. R6 `, `
$ p/ S) Q( ~$ L/ U( d3 t" R' o
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false: ~& s9 y. H' o  _/ O. A
  E+ p1 i9 c( b9 w6 N2 F' G
                               
登录/注册后可看大图
    try
4 P+ L6 ?. Q, x: _7 D# L/ H

9 l4 G; b/ X. C                               
登录/注册后可看大图
    {$ ]$ U6 B. U) [3 \6 I9 W0 K
$ i5 X% T0 H' ^: j
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
1 @3 w1 }  a  o) T3 O2 j

" r# _' ^0 n9 O! c/ u+ n9 P; @                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();4 s, N+ F4 M3 t& L

0 ?+ l! @0 ]. D3 T% m3 j                               
登录/注册后可看大图
        //创建一个根元素并连接。
4 `5 C, p7 H) q% H+ L4 g. {* [
0 E8 t8 b5 r$ s( ^' G" p& G9 n
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");5 o# A, \9 ]2 Q  O# V8 F: d

8 P+ u# V4 }' [* g- {' _                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
; s8 R8 Z& a3 G9 n& U

: }2 R; n$ a( C! h: m! v0 F) V+ P                               
登录/注册后可看大图
        //创建一个Person元素并连接。9 V$ `8 a, w& l0 _

+ j. Z% J" e, x/ c( n                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
# F3 J3 x* D1 w. O# }
, t2 D: i# Z. x, d8 S
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);0 \) Y, C. v8 m( v8 N  H

+ u  m3 y% y3 h/ ?7 @2 s                               
登录/注册后可看大图
        //设置Person元素的属性。2 ^& d$ J$ q6 L
7 T& n, J7 @& D6 k% i
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");5 A" h5 d; o6 K0 f
- q2 R' {7 R; c7 P. ~9 _% b
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。2 y* K' \& n  e+ s

3 ?, ?# N/ h* e2 j" ~                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
: o6 D) o3 l1 u  e$ n, v  V

9 x7 |1 D+ ~1 ?8 M" o                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
9 Y* P7 t. d6 t
& U( d. L3 i. N, @  U+ f* d
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);; G. O' A* l  s1 W- G4 @/ T- _

9 e6 h( \( o. j. d& R! {! m3 C                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
) s, z2 S; z% d. o+ {0 A8 j$ o* P7 N

* ?! S1 P% x; m5 }                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
9 `6 [, [6 H/ j$ _" O' j! B5 ?8 K
0 n* B+ S0 h2 B! Z, Y* S: [1 F
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");0 s* r5 n* T5 B& D- s
' h+ \3 a' {5 C
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");; }1 o8 n9 V$ I) A5 _2 s
" U  |% P( o9 t# H) ?5 O  R
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
! R! C/ f$ a" |+ k, U7 m
3 F2 x1 h8 H6 p7 {4 _5 t
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);0 S* b5 Q8 \: x( p) m! M

  N/ K  ^, A0 @; y$ S/ k1 l                               
登录/注册后可看大图
        CString appPath = GetAppPath();
$ Y3 Z- J2 t" W
* `- O- C% p, W$ b7 o
                               
登录/注册后可看大图
        string seperator = "\\";! {' F0 F" F" f& U7 u% A, k

" m+ S  H/ F9 E" ]                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
8 j/ E+ |* _; v( u8 P' X5 i

# ~0 r7 R8 c7 j. {/ i! U                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件- h+ k8 D2 ^; h9 f# W; a( e+ K

! Q% O- |# U' l5 x                               
登录/注册后可看大图
    }
" O! e6 @, |  }# z4 j+ H  t6 A% e6 d

( C. m2 }7 b( ^$ t                               
登录/注册后可看大图
    catch (string& e)
7 e+ k7 Z9 A4 H4 T0 r. m/ m

5 e, y# k' J9 E4 C4 s                               
登录/注册后可看大图
    {
- O# c# I, p/ G; p! y, o

; }7 q; s1 y% a8 }                               
登录/注册后可看大图
        return false;' ~; e2 I: j( E

& k& \+ U2 u8 u                               
登录/注册后可看大图
    }
3 H" {) g2 {' Y' o3 [
1 F7 F5 D) I* F0 s5 x- V4 A
                               
登录/注册后可看大图
    return true;6 G# y) q( _) `' k7 D4 M
. I' U* v/ Y' y( y0 v- |
                               
登录/注册后可看大图
}
1 K4 F* \2 W/ @* I4 |6 ]; C3 ?
7 ^9 Q% x. j, [1 K; n" I
                               
登录/注册后可看大图

" K3 b! c; k2 @! ^$ g

( i/ j- d# K; ^' J7 P                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)+ j: x" a7 c# |2 W6 }

3 t* N$ G# V9 b+ X& C                               
登录/注册后可看大图
{//读取Xml文件,并遍历
: V. i" U  v7 [) Y' @* q
0 x! w& x8 F" S4 v# F
                               
登录/注册后可看大图
    try% G  ?) U% w* c) a2 M5 k

: I3 }) |& w. n0 O* R                               
登录/注册后可看大图
    {
. t4 l0 S) Y, {) l4 s

# l' C. T  u  C                               
登录/注册后可看大图
        CString appPath = GetAppPath();
2 C3 G* g5 _: d. P1 x1 j- E! Q

+ Q$ o' C* T+ V5 w                               
登录/注册后可看大图
        string seperator = "\\";4 U; P+ p( z6 c  O0 B

/ o; W* U. S% f& E0 W5 }  ?7 r                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;- T8 R+ I# G7 a( U# O" n; _( s
+ m, F) y$ G$ g# x
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
: C+ k1 r* ?/ C6 T+ L
9 M- e8 x& F' Z# Q
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());9 C0 k" }6 R- ~4 j. S

$ F# n  [( g- l4 H! Z                               
登录/注册后可看大图
        myDocument->LoadFile();5 W, v/ P; k! v) R3 m( t
$ ?: R* H1 R4 w, p  i
                               
登录/注册后可看大图
        //获得根元素,即Persons。
* q/ w# K% J+ `7 r" N1 E

" Q2 @6 Z; H0 m+ Q# S( R                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
6 f4 E- C) r. a# e' e  K

+ ^$ F' @8 J& ~7 K                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
2 Z5 S) B) L+ P9 |
& l' w" p$ E8 h4 ]- |) |
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
- |% y) X6 H! Y# x, b

, Z9 h" l) A+ H3 r                               
登录/注册后可看大图
        //获得第一个Person节点。1 r- ~6 E% d/ O' S# o/ }

& L" X3 y1 u- b                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();. r7 U) t) Y- S8 |5 g

4 ]/ F6 P, Y- @; A$ Y3 t0 V1 c" B! p                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
5 F  U5 r( r- T" _0 n& a2 V/ A
( u+ ?9 A, G% k
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();- s/ ^2 R3 N, x7 j2 I
7 b$ Y, @8 f' j
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
1 s# q9 E8 P5 {- w. c8 ]
2 l5 B) e7 W" s, X% ~* N/ {7 ]5 q8 Y
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
) p9 b# i; Y% {% P/ B" x

4 x$ J7 l* R+ k* T& l, v" ~! Z& i                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
# A8 s7 I6 n% i' \3 C4 o

4 u' I; I- b5 O/ j  E* c                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;6 ]# Q# P3 ^2 @* `4 l
6 e5 C* Y: }# d5 t9 }0 l. {
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
, u/ j: k0 O8 s* b+ k0 C

# x! w9 _0 n; g% y# b% y& Y3 ^5 t) B                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
1 O# ~. q4 @9 g7 p1 |) r

0 |1 g% p, R4 k8 ^8 P' D" j) I                               
登录/注册后可看大图
    }
- ~9 }" m: O4 E+ r6 t

7 X% H5 h7 X2 c! b* H* w                               
登录/注册后可看大图
    catch (string& e)% q. K3 h& q' h

6 |+ Z0 g! G- L6 s' B                               
登录/注册后可看大图
    {
1 F9 ^7 I' D9 I: n- G- `3 a

! \# @8 L0 \2 k* g9 O                               
登录/注册后可看大图
        return false;. C. l4 i4 \( T' H9 K) M
5 I1 }( [  ^" K8 N
                               
登录/注册后可看大图
    }
! L# s3 Y4 g; h& o8 Y  J& E

9 A! m4 S& {0 C. ^+ j                               
登录/注册后可看大图
    return true;0 ]9 ?1 i% `- h3 I) o9 V
/ Y$ u) {% h, T3 l7 R
                               
登录/注册后可看大图
}
# r1 d. g6 y5 V
) V* v3 b1 D* P
                               
登录/注册后可看大图
int main()+ |4 v0 a! j: `3 ?2 K+ I

( O0 a2 w1 D+ }/ l- H( y& i9 ]2 X                               
登录/注册后可看大图
{
" e( w( y; M& n: u
  }$ v1 f4 K, M9 [( V7 n% {# p5 i
                               
登录/注册后可看大图
    string fileName = "info.xml";
% }$ W! Y/ c) x
/ C! Z; r1 c8 G  y) k* V" n% H
                               
登录/注册后可看大图
    CreateXmlFile(fileName);( f; ]$ A6 U3 G! l) s7 B

* C! ?9 U+ q" I) U' N$ ?                               
登录/注册后可看大图
    ReadXmlFile(fileName);
* F! c* V/ x' u! u- w
3 }5 ~) L: E1 Y) p
                               
登录/注册后可看大图
}
9 B, W  [5 U. ?( t+ R0 [. M% l9 Y8 V
& j) J/ a" P/ y8 U+ Q
                               
登录/注册后可看大图
" p& B, m0 b6 e  }; X

1 h) \6 s" {& Z9 O8 {
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
1 }0 l6 B8 S. J3 Z: Q
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了