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 4279 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片段:: E" y0 t% U: \; F4 y' }
6 c% L* h9 Z# S4 A; x
                               
登录/注册后可看大图
   <Persons>
% w0 {- M/ c# E
6 H& L' A, z& Z* x# v6 H
                               
登录/注册后可看大图
        <Person ID="1">! x! a" K1 a+ _: X' ]/ {
% J2 K0 w' l. a, b4 }
                               
登录/注册后可看大图
            <name>周星星</name>
( Z% u. h+ C2 n5 a+ F
* _. m( Z4 x" E, M# q$ ?4 j
                               
登录/注册后可看大图
            <age>20</age># C. [+ r) }6 z) S) |# V+ y

3 R1 v3 A* g* f+ b                               
登录/注册后可看大图
        </Person>
1 c$ j! I% B8 A5 T

& f- J( A* l$ o0 F8 w) p) U                               
登录/注册后可看大图
        <Person ID="2">
6 u7 ~6 b7 V1 X+ V7 k/ p( o( c
, N( o" L; J8 g6 `8 k. O
                               
登录/注册后可看大图
            <name>白晶晶</name>% q8 V1 D8 N3 z
6 E# p7 e0 D. J# ?2 R& W& R7 N# Z
                               
登录/注册后可看大图
            <age>18</age>
1 Z/ ]* W% {4 s% K% |

4 k" @: j5 h3 F/ P2 P# E                               
登录/注册后可看大图
        </Person>8 R1 e* s7 f% {/ M" T1 @% k6 s9 x0 J

3 _) Q% k4 t9 o# G0 p# M% y                               
登录/注册后可看大图
    </Persons>
4 m2 d# m6 D+ Y" K5 E

) _' n. s; e# C6 O& E2 a0 S                               
登录/注册后可看大图

" w+ w, H) K1 }  l  k. g  R
在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文件:
- X; U: D0 `2 q0 x  C7 Y5 }

7 J; P" k, _  ^& N                               
登录/注册后可看大图
<Persons>' a1 p. |" t% J2 m8 o* a1 O2 K
- v, Z& Z  P( E0 S/ o5 P$ H
                               
登录/注册后可看大图
    <Person ID="1">/ E3 @# E1 N4 u/ W

) |* c) R: E# l2 L                               
登录/注册后可看大图
        <name>phinecos</name>
7 G' I/ L/ a9 @7 ?& S' y
( C" H9 Z& y. f. @5 q
                               
登录/注册后可看大图
        <age>22</age>% m0 B; U( {. Y

4 H" e9 m4 Q2 M, V- j% h                               
登录/注册后可看大图
    </Person>
) o7 Y5 J/ V* u

) y) {4 }* D. s8 D( z$ U                               
登录/注册后可看大图
</Persons>
6 U; w1 K8 E4 }$ V+ P, \
& R! B& y2 d4 o1 O0 F8 @- S( i
                               
登录/注册后可看大图
6 ]7 j- d. R0 A. X1 f, `2 m6 s
读写XML文件的程序代码:
3 \# M8 H& V% _" Z
, m& a. r/ c) T) M1 A  ?7 S  C
                               
登录/注册后可看大图
#include <iostream>
3 {! `; p' w: o0 d4 _& T
) L% f  N' {: b" _4 _$ e
                               
登录/注册后可看大图
#include "tinyxml.h"& L7 L( R4 L: I) W2 s

8 L$ X- |# }, L( d9 U                               
登录/注册后可看大图
#include "tinystr.h"3 B7 C3 N8 |- t9 q
: g) d8 B3 q  Q/ A$ M7 P
                               
登录/注册后可看大图
#include <string>! m9 `, n; @" ~* O9 E! B$ \
! r. ^; K6 s* a* [8 c( {- P: d) |
                               
登录/注册后可看大图
#include <windows.h>
8 k$ i" p  ^4 P+ U' Q

1 x' T& L7 c% K9 O4 A7 r& D& e                               
登录/注册后可看大图
#include <atlstr.h>8 ?+ C' |: a8 s

" Z5 p8 Z! W4 I8 U" A, Q7 o                               
登录/注册后可看大图
using namespace std;
2 s& |# m* Z7 C$ }

- U6 x5 U3 t/ a# ~4 r                               
登录/注册后可看大图
' V1 T" I- X% \8 p+ {* ?/ \( n; B0 r1 ~

. l. T! I0 v8 F) z" c                               
登录/注册后可看大图
CString GetAppPath()
( ~1 }3 k3 M& k! z& `
6 @8 A$ N! z: `" W6 C
                               
登录/注册后可看大图
{//获取应用程序根目录
& T0 r( M" `8 u) A+ z4 h  }

9 `0 A2 {* D7 K3 S. P+ I3 g6 r$ e                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
3 \# I& ]8 v$ R& v+ M: n) C

; `$ F0 }2 t0 s0 h6 \2 J                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);9 v% l8 g2 _( |) G
" h4 L' Y- u( g3 e6 y
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
+ i; C$ K! V+ l3 K$ {: N# l

! Q1 x6 x% l& I. Z- z                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
4 j- [& v  H, A# g" m

5 m4 g- _; y7 o, g8 \6 s! t                               
登录/注册后可看大图
    return strModulePath;
/ b" E& _- K9 ~! q

0 P  F/ e, b) r4 B  Y$ h                               
登录/注册后可看大图
}8 u* d$ |4 v- ~8 k8 z1 m2 G
' B& q6 ]9 K; C% G+ G' k9 h
                               
登录/注册后可看大图

# }. `2 N8 g) P5 {
8 |+ Q( f4 U) h5 B
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)2 Z$ D1 U! c. F. }7 M  n  T* M
! \: S/ H9 e; Q* [7 E
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false: U4 U9 Q7 k2 b( g' X

! h) L- K1 D0 l% U' W- Z! b                               
登录/注册后可看大图
    try1 ~$ ?6 @2 U0 t5 j) j# I  W$ n/ _
1 t8 T2 p' u% X8 ]
                               
登录/注册后可看大图
    {
8 K/ ]( O6 g& s* n$ Z# k4 e
+ {% l) Z: W& O- s; X) H  Q+ W
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
& y* l4 q  G$ ]6 ^0 K0 J6 {
, I8 {! B+ j1 B0 f/ D/ |
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
4 h6 ~9 v% M- n' c6 p/ k& K4 |6 D5 x7 g$ }

. ?! y; |' [& l& j( ~; Y                               
登录/注册后可看大图
        //创建一个根元素并连接。! Q1 H* f, t1 `- K9 x' m
3 r  u% z: I0 G8 n+ ]/ J
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");) L! t+ f8 \1 C& D' `

3 `- @8 y/ F' p                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);/ L6 ]  f2 K4 W3 e0 m8 a2 x

8 [0 }9 A: A  u0 A                               
登录/注册后可看大图
        //创建一个Person元素并连接。
  q# P" ^, s) n4 x7 Q0 B
* I' W+ Z0 ^0 P% ~6 D
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");5 f: J3 F; C8 q8 Y. d$ ]  M
9 a# j  A0 X: U2 _
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
. p# j1 c0 [8 m/ i  Y

9 D5 o" i! }- H; w5 W8 u                               
登录/注册后可看大图
        //设置Person元素的属性。: u/ F6 c2 @- Y4 S4 ^9 a0 A6 t
) R( J' E* L' `. D$ j
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");0 q1 m$ m, d8 T, X* T( v
$ a; V& J* }' c+ B( y5 C3 R6 e
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。- F# ~1 P7 E# t  R; p! [" s  v
( O0 r9 ?& [7 _6 ~
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
2 A+ X) U% Y& m* e1 z  s
1 v. H! |/ X7 D, p% B8 V. V
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");
) e* v% _" A3 o; E  H' J

: ~) \+ U. a; q4 K, }2 F% P                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
  ?9 |1 w- Q$ Z$ w& a6 U
% J( {2 a2 D+ ?, m1 f
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);8 @# y* _: k; I7 t" U

7 ?9 _$ v; z2 b) b. _; h                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。& m! R4 }) X1 n- D% _
4 x. d$ }/ n( @5 B: g: t6 O
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
/ r) ^& c5 {' a3 Z; M
6 m2 V+ @3 n4 h
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
; I* l& M3 W1 F3 q3 T6 S  P+ D  t3 i. M

( F3 V5 N% c, V) L- i. g                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);5 v/ ~2 J7 p5 C

# z7 v7 ?+ m; Z, O                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);& M6 V* p- h) I; G9 v: D
' `  w' R6 C) s
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
% C, i$ J9 e* O. L" N
9 o, {9 e8 u; ?
                               
登录/注册后可看大图
        string seperator = "\\";
' W4 z3 V- N1 [. v# v. x; F

! I  T. Y8 r1 F% n) j7 j+ i% Y                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;( n# S- L/ t. m! x4 O5 {- [

' V9 m0 Y, I$ K( i( z                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件6 y0 |4 H! a/ U! P. x* k

& w" E3 @& d4 q5 R% z. t) b9 x                               
登录/注册后可看大图
    }
6 Q  x1 {* u2 y+ Y  I9 b
8 G5 p5 W9 n9 r0 u( o: v- q* E
                               
登录/注册后可看大图
    catch (string& e)
  [; Y& r2 o$ H( D  ^4 p3 b

3 ~9 H3 |5 h- N! I+ x: J- K                               
登录/注册后可看大图
    {
4 g4 |1 O; l3 F, L  `1 v8 r( p

: A( S" J0 ?9 ]* E' k                               
登录/注册后可看大图
        return false;" x9 m  \/ L' ~( n5 D

5 n/ M1 g8 R( T9 |( X                               
登录/注册后可看大图
    }4 K" j3 y& k. H+ C1 z: d' C& h
2 H; I; ?. D1 }- I3 g
                               
登录/注册后可看大图
    return true;
1 H0 t* H. t* a1 |
7 D+ C; |7 o. X% J- h1 n) b
                               
登录/注册后可看大图
}
3 h- Y* G- y+ M" q' b4 _& x  H3 u
8 \$ \  E$ ~% i1 p; Y# i
                               
登录/注册后可看大图
8 Y7 u( {& h- g, T, k) H

( g% `; m+ \2 {3 S                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)/ K$ w/ \2 H5 N+ o, ~
8 c# t8 _0 k+ J0 c' S4 z% P
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
) ~8 ~* r# w: E+ G8 a0 P* V% U& J" r1 \

8 n" a1 Y' @, E" |  r) `                               
登录/注册后可看大图
    try% P1 a- H7 u# R& ]! P$ A7 h9 X

2 N! M! f6 s6 o7 d* z                               
登录/注册后可看大图
    {
# H% O# T5 @' {( ~" u( d: z* d
, f) c2 K( H7 p2 @7 f. z. Y* y
                               
登录/注册后可看大图
        CString appPath = GetAppPath();# i" B1 C4 q3 @% ]% I

8 s, z$ y$ r* B. C                               
登录/注册后可看大图
        string seperator = "\\";1 x* r" k# L, \* K! y/ K2 C: s' S
( [$ v! W9 h; y4 f$ a
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
- {6 E. O! \/ P% I% ^
' ?! h8 Y! n3 R* @* q7 [
                               
登录/注册后可看大图
        //创建一个XML的文档对象。$ I% c* u7 w, W- Y; A( z
0 _7 q5 h6 v5 W- a
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());" {1 s0 y5 J( V. q
  ?% b! O$ o+ \0 u8 V3 l" S4 E! ~
                               
登录/注册后可看大图
        myDocument->LoadFile();
3 R4 H- p% `- J0 i: Y& j4 E
) L- Y3 y. G' M
                               
登录/注册后可看大图
        //获得根元素,即Persons。' U- \+ e/ [* z  s6 d, ?  N& Q
% v  L4 c: q) Y9 R9 I( |  V, b
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();2 x8 ]! F8 T# r: F7 b2 w
' o) h# T& k/ Q6 d* `
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
5 R) T* i& V0 f
/ J$ Z9 S0 X6 u, Q$ z0 s
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
$ E# b- ^# d: I# h3 A% ?

4 h% x$ O9 h# a/ m. P# ]. K6 y                               
登录/注册后可看大图
        //获得第一个Person节点。
  S0 w0 Q1 ?0 H, ~$ n7 C

, i  D+ x  y* m( J3 c  D- m( U                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();9 Z0 Y; ^: F( R  f4 _# ?3 L

$ Z7 ^; z9 q, ~                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
+ ]' ]$ v1 m1 J0 }

; d8 s% W0 X9 i$ w5 W3 u# w                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();  V" J0 _* h# P4 O1 @: @9 H( o
1 z: S& D3 o' k5 y# S! A. H
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();& N& ]! S! Q; w' q; k) M4 Y
# P. J: [3 \* V9 [0 \, T  [7 s
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
& d6 M' }/ C3 s2 X% {

2 I* ?  S. }: H1 ~                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。( O& ?8 J- Q$ ~/ [, L* Y

, t$ k/ \+ a; M7 [% e* e: j  q                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;$ Y7 A0 ~2 W- O! H0 Q0 p
" X  s5 v  H. I- T
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;9 v4 H5 T% q) w9 _% W) B' m+ _
9 M: n! w& l9 Z, `- @8 Q2 N2 B1 U
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;0 E% p$ z/ }% u5 R1 w: v$ E
& h% J- W! ?( c  a+ ]3 W  Z/ t
                               
登录/注册后可看大图
    }
0 o( h& J! r. S( v+ s

) J) b. \( h9 l- E                               
登录/注册后可看大图
    catch (string& e)
$ P8 I5 ]3 u) ~8 g

% C2 M, W$ x* [% p" _0 M; o                               
登录/注册后可看大图
    {
; l7 n' Q4 J. Q% U. T- ^

% h* }9 _, B$ t+ R                               
登录/注册后可看大图
        return false;0 f) R  _. ^3 u! x) Q4 Q# O" {* d
0 A3 }8 X/ w. D' k% s  q
                               
登录/注册后可看大图
    }
2 x# G+ W# r8 k$ N* H+ C$ A4 p1 Z* u2 F

# c- T6 m, S9 ^) _7 O& Y                               
登录/注册后可看大图
    return true;
2 G8 N$ M- E& G' X" k

, g' e3 ^9 A  _$ i% f" }  t                               
登录/注册后可看大图
}
8 g  {. A( Z0 I

5 Q9 b# M% d; [& L( C                               
登录/注册后可看大图
int main()
! u. Y; L2 y1 }/ n7 R# D/ f
6 C8 i3 y4 e6 X  L. ?' A
                               
登录/注册后可看大图
{% x1 |( q1 ]' B9 A1 N! [" x4 n
. V- z6 U1 L. z: Z$ a% D( h5 }
                               
登录/注册后可看大图
    string fileName = "info.xml";
& u; X. J) H# i8 H' J" V9 Y

  }9 ~3 V+ t; b8 B                               
登录/注册后可看大图
    CreateXmlFile(fileName);3 l, {( m9 v4 k8 z/ z+ q) V% _( P0 J( F
; C, `' d+ N: H; D
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
  U, d: g2 n+ N# a' [' e7 Z, V
2 A- z2 A: M/ ]2 }! d: M1 F- l% v; u
                               
登录/注册后可看大图
}
* A( f' A1 D* O& C% n- g# B$ Y
- A/ d3 Y2 o0 x* s! l( [
                               
登录/注册后可看大图

7 S; M; G1 Y0 ^) G) |- s7 Z0 d
, v; j, `! b. {
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  ; {: G3 R7 w: C7 d; o0 K
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了