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 4263 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片段:
/ ~$ V! I6 p: W9 Q7 a& [' A0 u; ^

, ^5 K, Z8 Q) z& U                               
登录/注册后可看大图
   <Persons>' `8 x" ^: O% k

4 w$ z0 z% Q5 C3 J  z7 l                               
登录/注册后可看大图
        <Person ID="1">
( v, d) j, D, ~" D
6 }& T, R. ]5 N$ H0 N5 j* G; o
                               
登录/注册后可看大图
            <name>周星星</name>* S$ d6 D8 g. w3 x, ~" c
7 u$ s6 ]) x$ B6 Q
                               
登录/注册后可看大图
            <age>20</age>6 G. D: `5 E4 K. w, n

! s, \+ e# J2 `+ d4 E                               
登录/注册后可看大图
        </Person>- N& }$ M2 y7 \5 g( L) b
" F7 R, {% t8 T, E( m4 A$ @# x5 X4 A
                               
登录/注册后可看大图
        <Person ID="2">
6 m0 l  |" P3 Z2 U% S3 g( E
) c) p6 N; Z. c: `
                               
登录/注册后可看大图
            <name>白晶晶</name>
1 q* [# O: D5 m4 h
5 b( @4 N+ s* ~% [  ]* x( g
                               
登录/注册后可看大图
            <age>18</age>
7 B; ^5 J$ e* p0 P, F& H

4 }7 |6 P( b$ g1 `  _6 J. N                               
登录/注册后可看大图
        </Person>; y+ W3 u) h6 `
" D& `# e+ D" V+ H# q
                               
登录/注册后可看大图
    </Persons>
- h! M0 N. u+ S/ z2 T5 W
/ v6 o0 M$ y$ }0 i# b
                               
登录/注册后可看大图

1 b) E; t+ v" 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文件:
5 n/ ?- k9 C* ]3 T9 M
9 S, D! c7 m8 o9 Z+ h9 w! G
                               
登录/注册后可看大图
<Persons>, o: q' l6 K% j& M5 u& g4 A
( J" R1 E6 I' E5 t/ L# `2 e
                               
登录/注册后可看大图
    <Person ID="1">
5 b* O% C+ S6 F6 O

5 o9 g5 L. F8 J! h. q, Z                               
登录/注册后可看大图
        <name>phinecos</name>4 \  e* p8 R7 d' j  B0 f5 z) R
: V. @+ n9 n( c" l  T9 S
                               
登录/注册后可看大图
        <age>22</age>
9 h8 c& d  D2 y! A

, ^' E3 H) H; g- [. i  S  ?                               
登录/注册后可看大图
    </Person>* G# ?. {4 k4 U; V; ~$ r

+ W4 U0 M( A# Z% Z) u2 {                               
登录/注册后可看大图
</Persons>
  Z+ G- s" q( |" N) Q7 l
9 C  o3 ~$ B  R) Z" z
                               
登录/注册后可看大图
/ ?/ Q7 l# ^8 j, R
读写XML文件的程序代码:) g9 J5 _$ b; e4 a0 j/ J4 Q3 ?8 e

) f9 j( o6 p, D. J: i5 i                               
登录/注册后可看大图
#include <iostream>9 s7 S. ?7 H0 Y% r9 w: V% x+ b8 C: w

! ?1 ?* i8 T2 p0 H+ H                               
登录/注册后可看大图
#include "tinyxml.h"
6 i( ~4 w& X& a% H, L7 K
: g, s" u% e$ e  C. u
                               
登录/注册后可看大图
#include "tinystr.h"0 H4 b: F, A9 I( `$ ~. b: R6 r/ h
# w- R& [$ @. q- G$ l1 T0 S
                               
登录/注册后可看大图
#include <string>' Y0 V" \/ V2 `3 `' D
' m* Z: d% A. d' {
                               
登录/注册后可看大图
#include <windows.h>
! y+ Y% `5 {: q
. ]2 m' x7 N, [) T) T/ i
                               
登录/注册后可看大图
#include <atlstr.h>
& S6 I2 H0 u$ J: l5 v7 X( N
4 c: {8 W' t( j" j( l" o, _
                               
登录/注册后可看大图
using namespace std;& n( u/ x. d, b+ j" j. o3 y

7 V. Q( v! [8 c" r% E/ {  C                               
登录/注册后可看大图

' [% T* G! i. }% v# ]

1 g4 y4 }. u# {' `, B6 D                               
登录/注册后可看大图
CString GetAppPath()
9 U7 ^7 K+ r: N- C

4 j/ s5 Y& Y. ^$ I) M8 Y                               
登录/注册后可看大图
{//获取应用程序根目录
$ m4 ?* m1 }3 I4 O) p

, r+ ?2 q' E5 b: w7 D% ~                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
' {' u' X. l8 A/ T

4 B, x1 Z4 ?$ o0 x6 O5 k                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
! y  ~! @/ a9 X$ E2 r* o2 w) z( b

+ C/ @$ V; K* c- H  Z6 Q! F. a0 b/ O                               
登录/注册后可看大图
    CString strModulePath(modulePath);/ b8 K8 t$ I8 x0 K0 z& C6 M) a+ }* C
: d+ |9 B1 ]' J% }) X9 ^  w
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));& P0 y( C! i0 @

* C# a( B! L2 L  q  ?$ F9 w0 u7 Q                               
登录/注册后可看大图
    return strModulePath;" n% }5 k+ Q6 `

1 y! ^" a: w/ v$ s5 y                               
登录/注册后可看大图
}' O; Q/ A3 W7 ]1 `' E2 t% P

: x- q0 I& B1 p$ \0 v5 `0 B                               
登录/注册后可看大图
9 H: H) w; V" e, f+ `
( Z6 w6 z6 ^3 Q
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
' Y: r, D4 A5 L* X

( c$ b/ W- L7 H& J) F, m& t                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
% H, b: i+ K# ]) L! Z2 ?- m
+ e) S4 F/ S/ w! a6 l( i1 e
                               
登录/注册后可看大图
    try8 Z( j6 C! Z2 ]

: D. ~% H1 t1 b+ }, p                               
登录/注册后可看大图
    {; `: D7 {/ C5 v
( W4 X) f/ O) z) b1 `1 Q9 S$ f
                               
登录/注册后可看大图
        //创建一个XML的文档对象。& k- w0 j6 d' @- e" R5 X" {  d

: `: ]. o0 v5 V: ?% w) x: ?/ P0 I                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
' t% C  h0 a$ T4 o) Z
) r3 f5 e, |. T/ O
                               
登录/注册后可看大图
        //创建一个根元素并连接。
7 \  N; X8 f# b9 ^

! c6 m3 [" ~9 O  @' d' `                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
" ?0 Y# h$ y  n' ^
+ ?5 f8 Z  a# M4 F3 E
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
/ _* S% a3 H- B# X5 O$ E5 h6 n
3 g2 x8 l* e, E3 I) j
                               
登录/注册后可看大图
        //创建一个Person元素并连接。
* u6 d' m& C& D/ Z6 G4 D
* _) k& ~1 K% ]% d
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
/ ^$ \8 h3 `; e; c% H7 Q6 Q( c" J
  y8 \0 z/ p. v# }+ V
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);$ m: z- W7 g2 E) b9 u6 l5 A: j& g7 U

, _1 `4 x! ]9 t0 _8 j9 T/ v                               
登录/注册后可看大图
        //设置Person元素的属性。
: f$ U8 r, P% v: U
7 c# s7 L' v  g# F# b
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
4 ~# }) n! P! N% F1 H6 s# C

! v  x* Z! e: m2 w7 ?5 S                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
! i' i4 a# E0 X* @( b- n% ~
9 {, C1 t7 I% u$ c: m
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");0 ]5 h- e' p: }% W- U
+ @: y; R8 B% x! ]1 z% n. x. G
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");; ~) t; Y. h: F- d
, R, R9 C& _* W# P7 B6 x. \$ k6 y7 b7 w
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);6 Q' s: d- r7 R) ]1 J& B& N

) U9 B, h. P1 G                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
5 d& D! A1 _: B' t( M" D

7 X1 [9 x% z. h) ?. r                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。& w+ j, K1 W3 K; Q5 }) y

# }" p- F& a5 @2 X                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
. E. P4 n" K/ S7 ?
6 {& R4 p9 @4 a8 S3 o
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
5 D$ b1 S+ v% V0 w- S

* V$ ~( E& J" G4 ?4 A4 _# W- F9 i8 x                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);* B0 g; V+ f, P, z8 ]; @4 E* I

0 H9 H' D+ K* ]* B9 o. X& S' D, N                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
- I; b  X" r- {7 {
5 q7 |$ A  x2 M! B+ K/ T! J/ N
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
" |2 m5 t8 d9 s+ {$ b- p6 S
! ]  [! ]& t: ?5 F3 x7 o6 B1 A
                               
登录/注册后可看大图
        string seperator = "\\";7 r* g5 G0 |# Y6 Z

+ I  D4 D# D5 W- K; e$ T                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;+ ?& ?0 D9 E6 I) {

$ f* u) g7 F: H3 B                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件$ h$ c+ d; x% g& V" n; w4 h

2 m9 n& `% p" V$ ~: F+ q                               
登录/注册后可看大图
    }
/ S& u. k4 K# P& m9 n$ u8 L; b& u7 @
  _' L' t1 x; g# T' e: z5 W1 m
                               
登录/注册后可看大图
    catch (string& e)
& w2 f. j! e0 Q/ z2 w
& o% M" T% w, k2 x1 x
                               
登录/注册后可看大图
    {: }5 ?4 j8 x; r+ J7 J$ u; q

: s6 `5 O1 j9 a' f# {9 d                               
登录/注册后可看大图
        return false;
8 q( W, Y5 P  b* i

$ Q5 Q% A* Y6 X" D8 v; `" J7 ]                               
登录/注册后可看大图
    }& Y$ ]% _: }$ g  U" Q

% v$ o& e' D! y, M7 f                               
登录/注册后可看大图
    return true;
2 S/ P  L& ^! \% R9 m8 j
1 Z: L) H# f( e0 p6 ^0 @
                               
登录/注册后可看大图
}
, s2 \4 C9 x  S5 G
6 E4 j5 y! A6 b; C( d
                               
登录/注册后可看大图

: |, u, I1 ?% Z

8 _" y3 G* y- g( d; z0 H/ P                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
; R  \/ n1 s3 r: x$ N# Z. x; [! N

, ?. X6 J2 ]" b" F7 Q% W1 }. F                               
登录/注册后可看大图
{//读取Xml文件,并遍历. P, `+ C; |# w# _. Q
1 `* c5 l4 Q( Q4 ?! u
                               
登录/注册后可看大图
    try+ }9 K8 p" m3 ^3 i" _
9 ^. P1 `: z, f
                               
登录/注册后可看大图
    {
8 L5 Y( v7 c  a% C$ w5 S
* D$ ^. m8 v- l' `/ ^9 a
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
4 q% e$ Z' E6 L1 Z' {. \1 V* }
" {# B0 o/ ~. T, u# a" l
                               
登录/注册后可看大图
        string seperator = "\\";2 |; u/ q: @1 A. e: a% A: y; y
* L) q& s: @4 i/ `& F
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
+ P2 `) n& d) H* n+ ~& }2 Z

7 j* z# c- I* W/ L0 Y% k                               
登录/注册后可看大图
        //创建一个XML的文档对象。
/ M: l* y( W; t, Z, O
6 c8 r+ D4 D5 o7 z# E
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
: f6 ?  ^4 L  U8 e9 K( A

6 r0 r8 N; S) e& G& l  K                               
登录/注册后可看大图
        myDocument->LoadFile();! f+ B; ^0 a$ r2 u- L/ U
! Y7 U( m& Z# a( y* X8 z# }2 Z
                               
登录/注册后可看大图
        //获得根元素,即Persons。
4 k' c* F& d) o1 f2 Y
2 i5 |1 ]% L0 P& t4 d) h# _0 N
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
8 ]1 }. q0 T9 h* k+ K8 g

9 k5 Q" p( ]9 I# C- y/ A$ @                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
" D( R3 r0 w8 [

' [4 M" c4 Y& w  `, w                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;7 t, V( Q% h% _+ T

9 D% u  p% Q% v* V                               
登录/注册后可看大图
        //获得第一个Person节点。
' T# e; O1 L; o8 D/ p

( X- i4 t( k- |, [                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();) v5 @6 T9 l, I/ M5 d
! ]9 @; }. z6 G, J. w9 M6 P- m) D
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
5 |1 P4 u  k' G& r0 C1 r( S0 q" D

7 k0 T. Q" ]1 ^                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
- b) Q0 p9 F) o5 }/ ?$ J

! c$ C4 [/ w2 p                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();8 y) U; j9 A" a2 d" G

- d0 z+ r8 A4 S6 X                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
! F7 S) i, R+ X$ [& n8 v' l

! d7 z6 {) n1 L4 v2 H( G; V' ~                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
8 S* t( p& A) p( c3 |! l
/ c3 {4 ~' n, @- \
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;5 W  ^3 U' c: u2 Y
: `+ T7 h  s# G+ f6 H$ |& B5 U
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
' m& `2 _  }5 V6 j' W

/ Z) O+ [( d+ s( c, j                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;% n% q1 N1 l& H6 _
* v8 W& I; p3 O: i7 O
                               
登录/注册后可看大图
    }
  {3 z9 @, ?/ z* f( ~$ e
! q7 t  H7 ^! |" T5 Y, \
                               
登录/注册后可看大图
    catch (string& e)
7 F- d' x! l) ?
! H% U9 \9 i+ Y8 ~
                               
登录/注册后可看大图
    {
  K1 p& G: t$ n" C. C  W

! x( g. X. G# a  {' E                               
登录/注册后可看大图
        return false;
( M/ ^- f( V- Q: [0 l
6 }3 Y# d! B* N2 H/ j  O0 p, U: F
                               
登录/注册后可看大图
    }( G1 L0 s8 G1 {2 h" r
: p6 @$ B; ]: L8 g
                               
登录/注册后可看大图
    return true;0 Y8 c& |6 j# ]9 n) D2 C- j1 x! B
. O$ y/ v2 ]$ o! D2 a+ h
                               
登录/注册后可看大图
}' V" h5 D2 Y4 d4 b+ e% I3 y! c
$ U! V) s6 ]7 u# y/ s# O$ {" n
                               
登录/注册后可看大图
int main()
4 T' w/ j$ D# {/ y4 D- S

# \/ t' h: {) w" S                               
登录/注册后可看大图
{0 M* u: U, H0 x
& Q# y, ^, x( A9 v# j" q
                               
登录/注册后可看大图
    string fileName = "info.xml";
; e+ T6 ^& [$ p& _0 ~# C+ s9 k6 [& h7 S
  x. l- T; `( h0 q' P$ a
                               
登录/注册后可看大图
    CreateXmlFile(fileName);8 c+ Z  `9 ]: u$ e: }& w+ x
) n2 B2 ^6 P7 r
                               
登录/注册后可看大图
    ReadXmlFile(fileName);* W1 k+ `6 _2 Q4 [9 [  Q

7 P* ]' J: B* T0 O$ @" v8 }                               
登录/注册后可看大图
}
! Z) w5 ]* t* L- ?2 s' H

, D4 W5 p4 Q6 L$ v                               
登录/注册后可看大图
3 p7 `& O/ w- R: A4 a

) O: J0 h1 @; C3 p( _+ E& c4 @
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  + s) |4 A0 W  i7 o
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了