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 4238 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 U# [$ {' c" s' ?8 W
1 P$ T' X9 u+ N/ v0 N1 \
                               
登录/注册后可看大图
   <Persons>
. A8 Z9 v- w+ }1 R; T7 {7 w

8 l$ ~( h' ~- j4 U9 f- o6 E: E                               
登录/注册后可看大图
        <Person ID="1">0 d6 i  ~& r( t( I
! G4 q/ ^9 M/ L7 J# n
                               
登录/注册后可看大图
            <name>周星星</name>8 v* X2 o& o% a* r

* c! Q8 u; M- E0 r- w9 K                               
登录/注册后可看大图
            <age>20</age>( V+ ~1 `  E' r% @

( m0 \& ?4 S; i5 d                               
登录/注册后可看大图
        </Person>3 R$ S# h/ i- |# }, `+ d
# y+ `5 d7 L5 U! n
                               
登录/注册后可看大图
        <Person ID="2">6 ?+ O. S7 k2 l! g

& V3 }7 }  k# t* @/ k                               
登录/注册后可看大图
            <name>白晶晶</name>' l2 w0 O5 l( V+ _- G

- I8 U3 c% e; z6 o* B                               
登录/注册后可看大图
            <age>18</age>$ [( O( c+ W9 V0 x  @3 U  m

+ u+ ]  F2 w/ U5 O9 }/ H                               
登录/注册后可看大图
        </Person>, w( J6 t. Y' J5 N

% b6 g4 }7 r% x$ [: y. I                               
登录/注册后可看大图
    </Persons>
1 p9 J$ T5 F5 K# N. D. L, Q

3 {' U7 q( A" W7 i                               
登录/注册后可看大图

; U( `/ Q" w2 b8 B& b+ \" v" S/ x( y
在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文件:$ `' i1 f) G; h0 y% a3 L. @6 k
5 ]& i$ j5 Y9 r4 t
                               
登录/注册后可看大图
<Persons>9 M5 K0 Y* T7 U6 K
: n* r) y2 S+ U# |& X" i8 H
                               
登录/注册后可看大图
    <Person ID="1">
5 B- B/ I# V5 k( N/ k8 G( e& B2 V
6 F2 U# p  q/ R( b: F
                               
登录/注册后可看大图
        <name>phinecos</name># E- ]( s& K( ?3 ?8 a& x- V

$ u; h3 Y6 h# I( P# ?6 ]- W                               
登录/注册后可看大图
        <age>22</age>
- R, ^) Y( H8 o' p  _! t+ N
: |8 a: u9 \9 A; ?  f+ n  o% S
                               
登录/注册后可看大图
    </Person>
- T6 i! B2 W. r. }2 r
+ V: t0 Y! ~6 w, b( {
                               
登录/注册后可看大图
</Persons>
) ^! e' @3 m! E9 ~, g
# }0 V* q& p* w9 Z0 c+ G1 [
                               
登录/注册后可看大图

- j0 P& [6 ^7 o5 o- P
读写XML文件的程序代码:7 D- B3 @4 {+ s$ A7 U' M3 o/ u3 a
9 I# q  z- x$ D
                               
登录/注册后可看大图
#include <iostream>
7 u: o% H$ C* \$ l

1 s* |! N- D( B. l6 r                               
登录/注册后可看大图
#include "tinyxml.h"8 |: r+ N% h' @( _3 Y: r
% X& }0 j. n1 D; R( U; M
                               
登录/注册后可看大图
#include "tinystr.h"
" O; @% {8 W+ U$ G: I* g' }4 X/ S

: r. u# @4 [; G7 n& _$ d& e                               
登录/注册后可看大图
#include <string>
) q- f7 l% |% u  b
" G- d" z- g& x0 E9 d% x7 Z9 n
                               
登录/注册后可看大图
#include <windows.h>
) R2 h4 ~( o* y6 z. ]8 z
: n: ?/ f9 U2 W) F7 E$ V2 [
                               
登录/注册后可看大图
#include <atlstr.h>
# B4 U: i/ U  K5 ]
6 }; q8 `2 ?5 e8 ~. y/ j' a
                               
登录/注册后可看大图
using namespace std;* y, J- }9 e' Q
1 J- J8 a3 p- g0 j4 M8 `3 h5 w
                               
登录/注册后可看大图
( \; T) j- I8 }4 W0 {( h7 f/ Z

* C; A$ i' W1 d4 O                               
登录/注册后可看大图
CString GetAppPath()# W1 @9 W; O/ }& ^( Y/ Q, }

; R' a2 C7 F" O3 u5 f% F2 f                               
登录/注册后可看大图
{//获取应用程序根目录* R  J7 |1 Q* q# O( Z+ A. z" G

# y3 r9 g3 v  l; v  t# l  N                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
8 k" q2 Q! }7 V$ Q; E9 q) K% I

% M8 z1 {  L, t6 O; a% \                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);8 F& J) C2 h  a& `2 q3 \
1 s( P0 b" u( D
                               
登录/注册后可看大图
    CString strModulePath(modulePath);: p. C: P$ y) a4 K  K

. e) ]/ O. l) S: S$ v, c                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));8 b' |& V6 y: x5 A: O3 v% R, n
& d- `: {0 X5 E: k9 l
                               
登录/注册后可看大图
    return strModulePath;$ P; @5 C3 R6 i* D% \% o/ E
/ j9 n' q" H# R% B/ c+ k; z
                               
登录/注册后可看大图
}4 v: o& l4 Y% w$ j. L% b- R: x

8 R' t* [0 X, ~2 _                               
登录/注册后可看大图

! z$ S! u% z9 N" U) X7 O& s

, u) g3 T2 o  M% ]                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)4 R# H! j- B5 A! F- C* J
" c4 v- d4 i* G( }2 u# c
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
" a/ b1 b0 W( m# Y6 U, H) R. ^

- \5 F' ]/ W8 y' F; \& l                               
登录/注册后可看大图
    try
# X1 }# s5 ^; n" u7 {! a: O" b
% g2 `+ {8 q- H0 D7 V3 j& o- _
                               
登录/注册后可看大图
    {8 M* U7 U4 h) g5 `2 E$ }6 g

& }1 F  M6 r# ^, ^% l                               
登录/注册后可看大图
        //创建一个XML的文档对象。
  v" o. p7 M2 U, ?

' X9 o2 `( b9 R# P( U8 D                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();* Q$ o) F5 J) e2 I* e

; [  v2 r0 v0 E; [& b' v2 i+ G1 z                               
登录/注册后可看大图
        //创建一个根元素并连接。
% d1 n" V. k. c+ M
; [) j: L3 H4 [! l  T% j& [
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
6 H) Z& H4 ]% j2 F, h1 Q

8 N" [/ q2 S8 M# x7 q                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
/ P6 C' {6 j3 |; n
+ I7 D2 ^3 J8 d/ v
                               
登录/注册后可看大图
        //创建一个Person元素并连接。
/ c$ L  S- D# Y4 Y$ n4 T$ j* c. {
+ x4 A/ l  ~! K$ G& D9 G
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
" r' a+ A  d9 I8 t: `, a
9 G" T8 M; R6 z% R( U
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
( w" u7 S/ c7 \! t0 x, t; w

, M$ f/ P; I  T' k; U  d$ A1 K' d. D9 U- d                               
登录/注册后可看大图
        //设置Person元素的属性。
0 j* a; I' p  f% s# L
, s( B3 |! M3 l8 U
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
. Y7 S6 ?/ G" O' D" B
: z% U, H% c; O1 _/ ^6 \
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。( V$ ?: K% k) t' E, S
& `" p- m' o& Z7 b3 f, Q9 R
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");5 u4 M! P7 m9 P' _) d! s% ~

( W( G% e& d. j4 u                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");% w" V. D: E  x; _; B( e2 {1 E. t
% Y+ [; x7 K2 C% b
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);$ P* k- M9 A1 N$ h3 q
* }8 I6 k4 h' m! w6 o
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
1 ~$ p- E2 ~6 z: q% I! R

" h2 A; r' H5 V5 _9 O! J                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
1 `% n3 Q( {3 C' |
  F  g$ Y# r+ f- g( H9 {% {' B4 p
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");5 c5 ^4 M2 A0 c2 C4 r; W; U3 @+ d
6 j; N/ U8 |6 e1 P" K
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");* s( u9 q/ D0 g# b$ `" R
5 R9 p5 I1 J1 |5 {
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
1 \6 t7 u0 S* X" m

2 B2 M" ^0 g- w/ x3 V9 D                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
$ X$ j6 T' C% q7 l$ M0 n5 g

- a, R% i0 {' }! S                               
登录/注册后可看大图
        CString appPath = GetAppPath();
" O; n5 P3 x5 M8 w3 s; Z

6 j9 ?- v7 @2 v; B0 T( m* n                               
登录/注册后可看大图
        string seperator = "\\";! J8 t, Z# Y5 X+ P' m% G

4 o3 B+ j( i( D7 f" O; t, {& k9 J                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
/ v2 r; m, C2 J4 A

) _3 D# K0 `( |& e                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件* A: {; L2 f9 ^9 k1 @' {

9 i& h% {: f& G1 \0 |$ d                               
登录/注册后可看大图
    }
1 H7 q' T$ z* y
" F( {! S7 W" ^' f- k, o) E
                               
登录/注册后可看大图
    catch (string& e)
* Z2 c. i2 R; i

. k- M( k9 l/ K                               
登录/注册后可看大图
    {
+ X5 h' O: G1 s' _1 K  p' w) F6 i3 k
5 j4 a0 a9 `; Y, L; j
                               
登录/注册后可看大图
        return false;- m. u0 y! _9 y( a5 `4 R
$ _1 J8 r" \6 ^  E! s0 m
                               
登录/注册后可看大图
    }& G# l0 I/ \' T9 O7 c
% l/ y1 a+ Z2 F6 n1 s
                               
登录/注册后可看大图
    return true;
. v# u7 v* W& T& E  a1 L# r

3 j' t* i. y5 Q                               
登录/注册后可看大图
}
7 ]+ t5 J' b" g5 ^4 {" L; q

; W. Z% T- J$ \4 ]                               
登录/注册后可看大图
0 b0 B* G' u+ U, T: _

# h4 E4 h% p' G( L                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)6 f( y$ |) S6 J! z" M

- `* m8 x0 ]* @( ]* O; n                               
登录/注册后可看大图
{//读取Xml文件,并遍历; H1 y5 z) J/ O1 I$ M  r5 S
1 M/ B. J; F, y/ W8 G( r
                               
登录/注册后可看大图
    try
$ {6 o9 g* S5 _: _3 u1 B/ m
9 c; _& c& w+ |, q
                               
登录/注册后可看大图
    {4 m% O* s" r$ P' k5 W  F

- q: n9 V; w$ F) j7 f/ c  F' }7 f                               
登录/注册后可看大图
        CString appPath = GetAppPath();' s6 S6 P# J0 O. i; u, ]
% g! N, T7 A: n$ U) A1 @; v1 `
                               
登录/注册后可看大图
        string seperator = "\\";
- n0 z5 C# R7 P* w
" G5 Q+ v& X; ]8 A6 Y
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;+ O8 ?- D' w1 N2 E7 B& A

& V9 e* j. Z, F0 J% V: @9 C                               
登录/注册后可看大图
        //创建一个XML的文档对象。( `7 J: ~' Q: @" R% k. x) l
; B( B' O7 x* h& f
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
, x& w3 T3 [1 C; @! l3 q: E' C
; |* b& `& e5 D: e, S. M
                               
登录/注册后可看大图
        myDocument->LoadFile();
4 u2 w: E3 A; w  j! @, r7 W0 r

' w/ U( |# Q8 J3 K* g9 r                               
登录/注册后可看大图
        //获得根元素,即Persons。' V( B5 u( [* H0 I: Z8 k- F

# Y& c* n5 k  ~# m% O+ |: S; E% `3 q                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
. N( q5 p5 w' B  f& u/ ]. x
" ~( L2 J, b4 A7 b+ V! s! p8 \6 z
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
5 B' c0 O4 o6 u$ u: a& M  ?3 h4 `3 D

. E  l. F: o0 Q; g/ N                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;$ l8 j' ~- q; _0 ^0 J

" D+ f8 R9 w7 _; Y3 T  ~6 C& W                               
登录/注册后可看大图
        //获得第一个Person节点。
; s' o1 c; L  s" q! u. c: O
5 _, T9 L: }" f! e& e
                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
3 F! t/ [' h$ b
+ b( J/ b2 j5 K9 |
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
" m3 C) j$ L2 ?5 c/ k# L. x
, x- C9 n4 s& ]7 ]' Z. [, E, ]
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
" Q* \* @, G- r: o

% B# Q* K) x+ n/ e$ {                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();3 r8 ^1 P! L4 s* z3 }4 n
4 @3 {( o/ \# Z
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
+ M5 x  `4 i, B
! M* [4 J2 x3 ?
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。, N" h5 v% ]7 D1 b2 o2 e4 @
/ x! z  ~9 d9 g5 `: H# ?, W6 J, Z
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;  c1 F) C8 s3 l

0 [: V: o  P6 x" |% s' n% R9 {                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;; a3 I+ T: Z. s* q9 L3 u* h

. i! ~: G" o9 {, e                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
* ^8 ?- d1 ^% G% {% r7 v0 l: K; i0 R
& i  J) @) I: @2 _
                               
登录/注册后可看大图
    }
" [* x. _$ P, j! u) u

2 {5 q' F- x! P6 Z* p                               
登录/注册后可看大图
    catch (string& e)$ T* Y( y0 A4 r1 `3 J
5 \9 c7 c5 Z+ ~
                               
登录/注册后可看大图
    {3 e' q7 N' F* l3 ]+ w! F1 O- J  t- u
0 F, M0 s9 X6 w# e: `# i  E) {
                               
登录/注册后可看大图
        return false;
8 C' K  K* e6 P# o3 @& ]

( K0 ?( u- M) W" ^* W3 i                               
登录/注册后可看大图
    }
1 z/ ^) m% B9 R7 `4 G' O

' C/ T- W) u2 X( a  ?& j/ O1 v# l                               
登录/注册后可看大图
    return true;
# b! U. I/ Z: J" Y. g: k
! g6 u* |9 c! ]
                               
登录/注册后可看大图
}& V8 g- T$ L7 [' ~# l# z
2 \3 K0 a! C) D
                               
登录/注册后可看大图
int main()8 P  Y2 s7 {* C5 S; B* C
, u* i, b* G6 o( C
                               
登录/注册后可看大图
{
: F- U5 G1 Y# z/ l. Y: ^2 \

9 b& U8 u" U5 H9 i& \  D, o' W                               
登录/注册后可看大图
    string fileName = "info.xml";
" ~/ _( F! I/ [+ b+ z

, i3 R$ w" B6 R& ]) e                               
登录/注册后可看大图
    CreateXmlFile(fileName);
& h0 U1 Z& L) F7 A

: |( T' @4 Q" D+ s* r& c8 C                               
登录/注册后可看大图
    ReadXmlFile(fileName);) Z9 A+ w* U! G  X

. L( `. {/ B; i2 H; }5 Z                               
登录/注册后可看大图
}3 a( K" N3 e  t5 A% Q- D

; z8 s8 i6 Q3 M5 B9 g                               
登录/注册后可看大图

& `3 n6 Y4 F; ]( w! p& v3 ^. q" E
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  " t% z9 _0 ], z7 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二次开发专题模块培训报名开始啦

    我知道了