PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

PLM之家PLMHome-国产软件践行者

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

[复制链接]

2015-1-29 19:28:56 4366 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片段:0 N/ \" ~. U( `& c3 a  [# w) ^

/ x( }5 S% z- P" v4 |3 r- m% ^                               
登录/注册后可看大图
   <Persons>
, ~5 N/ v# V& k& u; e% [- O7 R$ l
" t  N. f; l1 t# e$ H+ }
                               
登录/注册后可看大图
        <Person ID="1">1 q1 C" |5 M; B% }$ W- i* I; W5 N* {

! A, m$ v. Z0 T/ z                               
登录/注册后可看大图
            <name>周星星</name>
6 U, @/ l9 x2 Z! \; I/ l
  g5 o9 [/ l7 `5 v0 p: B3 R% K& G
                               
登录/注册后可看大图
            <age>20</age>' i, Z$ \4 \0 t* ?# I; `
+ X: `# `8 Y  @8 R" H; b1 T
                               
登录/注册后可看大图
        </Person># I$ y- a' f  m* ?1 N9 A& I7 [
# e$ b' l+ [9 |# b5 u: O" |) Y
                               
登录/注册后可看大图
        <Person ID="2">
- v& J, `; Y6 N; v) Z

) @9 n: E4 [/ j+ ]' T% ]                               
登录/注册后可看大图
            <name>白晶晶</name>9 `4 D0 N$ a; q0 K

. F6 B2 X* v& c+ B                               
登录/注册后可看大图
            <age>18</age>9 U% M" `9 k& ~  D. G4 b9 }

1 J/ }. I& p9 H7 [, c                               
登录/注册后可看大图
        </Person>4 P) r4 L: `& A% Z9 W
6 _3 o9 _3 P; I4 r0 _" U
                               
登录/注册后可看大图
    </Persons>
: _0 I4 e. p" W
) Y7 g: M# l3 i" R* e
                               
登录/注册后可看大图

% I' s8 u& d: |
在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文件:
" s3 l4 q* x( _5 r" t) \  ]
6 _( @9 t7 T" M
                               
登录/注册后可看大图
<Persons>, C2 ^( C: g- z* }( ~1 c4 X$ ?' O

0 J7 I0 l9 U2 e  G                               
登录/注册后可看大图
    <Person ID="1">
. L9 Y( m, u: O
3 b9 J  T' c. A, J" r( H
                               
登录/注册后可看大图
        <name>phinecos</name>
9 ?- w. @% W- H2 q$ s3 i7 N; ^

% G" `, x+ f! m& Q- ~6 s9 l2 H                               
登录/注册后可看大图
        <age>22</age>
0 K( e& O( F0 ~+ _' t

  T# }* i. P3 f' v9 i                               
登录/注册后可看大图
    </Person>, W: b- ]2 M( r, F/ p
  ?7 C8 b8 R, E$ E1 W5 b
                               
登录/注册后可看大图
</Persons>- [* X' _! `5 J' ~) g3 R  `9 I

% D- h$ @3 v3 l$ A2 x                               
登录/注册后可看大图

- J$ q/ K" A% a
读写XML文件的程序代码:* z+ l) z, M$ D# b( n0 `: \/ z
2 C  \$ w, e" f) ~  y
                               
登录/注册后可看大图
#include <iostream>
# d1 Q5 D' D7 p, I

, C& p. [, f: ~                               
登录/注册后可看大图
#include "tinyxml.h"
( s5 |2 ?6 T5 f
0 i! ?+ T+ g" X+ E& j, s* H
                               
登录/注册后可看大图
#include "tinystr.h"+ j7 K/ I1 W# {

, V0 }9 @1 v; g; o                               
登录/注册后可看大图
#include <string>) o  n/ A/ F6 f, H
7 E& m# q. q& m. ]( z  f+ v" u
                               
登录/注册后可看大图
#include <windows.h>
9 w, A/ ]/ f$ L6 P, a& @
+ [2 K! j0 Z# l2 h' F/ _! }# W; `
                               
登录/注册后可看大图
#include <atlstr.h>
, R. k6 W9 A' a* n9 R

: ?9 o. ]7 D6 N3 i! S$ E2 W% f* n                               
登录/注册后可看大图
using namespace std;, q2 B6 X- E1 l

/ `& J, P* Z. ^" N                               
登录/注册后可看大图
1 k% X7 `& [: j8 [

0 [) r/ {- C; z! B                               
登录/注册后可看大图
CString GetAppPath()
; e7 ?- I& B% F! @, D- h& |4 o

( F( S% M# a: D0 \                               
登录/注册后可看大图
{//获取应用程序根目录
7 G3 t4 u; X' |. X) m: o) {5 Z0 V
- F& N/ `4 h' P$ N) v; _5 Y
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];
! y: p% A* o1 [- J4 l* p
0 a+ c* Z- V' A. k
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);1 l$ O; j4 d% a* x; O# q$ D; `

3 P1 k# W5 T3 e, k                               
登录/注册后可看大图
    CString strModulePath(modulePath);
" g9 O1 a' e2 {3 z8 H
2 P0 t( t& _* H2 i- V" @0 w
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));8 O* A/ v( M7 s, O  Y

. y+ x* j: y# f+ v! m5 Q1 \& j, \                               
登录/注册后可看大图
    return strModulePath;
+ k, n4 b$ {. S+ A4 I
8 {" P3 c' z& x" Q: T+ \( ~6 U
                               
登录/注册后可看大图
}5 E$ v/ y) F; W. O. Y
6 U, ?3 W  S. x* o" x
                               
登录/注册后可看大图
& Z! [7 A% Y1 K( ]4 _( Z- M! T/ I

& |4 F& ]& h/ B/ z, Y                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
) t& {! s1 I% l9 h/ c3 B

* D; T: g( ^; g9 _, V, I; j; u' }' n                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false$ g! Y4 g+ e6 X- o# j! u( {
+ d8 q2 q6 s- @# v7 f, x7 A( w
                               
登录/注册后可看大图
    try
. h; Z+ t" ]# e0 G9 {7 ?' D
3 W9 A, v9 `* k$ l' d8 n; M
                               
登录/注册后可看大图
    {/ e: v7 O7 \6 I# M8 @. O

6 U7 |% G9 v8 Z+ V                               
登录/注册后可看大图
        //创建一个XML的文档对象。' A( \3 A5 C7 e7 Q+ ]
: y$ O7 u% V' n/ J
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
' A2 n3 ~$ L0 U6 L/ F* Y$ P- t7 m
) n, k& i' F* |& n* I. \' M
                               
登录/注册后可看大图
        //创建一个根元素并连接。% s0 g( w4 S$ _8 A* D2 z
7 c- ~4 O9 k6 P) S
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");% j' D7 k  a) w+ L9 F+ P
1 H) t- A; R1 R! ~" M5 W
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);6 J, b# ?# o5 B  T2 G# v! X
- |: |0 g3 P# H; s# ?
                               
登录/注册后可看大图
        //创建一个Person元素并连接。
8 s6 x% O+ o& e3 z

# ^7 r. W; a9 M% B3 o                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
* K. J5 Q' o* V: o/ S* N. U

3 A1 @- O" ?; M) G2 }" J                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
0 _- H7 V2 R! w4 \
' W; B) p% ]9 x5 u* }
                               
登录/注册后可看大图
        //设置Person元素的属性。
9 H9 X9 W2 }2 ^/ S' D9 o

# \* `" D0 X) V7 v, z& h                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
* a% N4 J- j: `/ V& W3 A
* n7 Q" u- e: [- e7 `/ D- |
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
1 K4 W# @" U$ [- P" I8 `/ Z

9 f5 C  h/ A( `. ^9 H5 P                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
! \; [  k9 x! w( V) }
5 `0 c7 \0 P, A2 Q  H0 w: \/ I
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");& `# T& f! U7 H; z
$ ^% r7 }# ?  `' @9 L3 h
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);0 S4 [: s& h* U# ?7 }0 D, }
! M9 j$ I& @9 f+ z# M$ J, t
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
. y: @- j! P8 b1 h
7 n  j- c6 P/ Z8 ~
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。. R2 J8 _; z# Z! _

7 Q  C6 p, C0 K! M6 P) @                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
) [. A" u1 W# I0 g* u, O4 L8 M
* e8 j& I; E) a% o7 C7 a6 H
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");: H+ V$ p- @$ q$ m% G; ^; O" Y

# m  O0 C5 T) ?. N9 j1 \, d$ i0 P                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
% k+ d/ t$ M8 ]' F, A+ K# S5 `
- ]( s+ p# W5 ?& }
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
/ {  e+ j2 t, @& c' @0 x
  n8 a6 I2 [  Y9 \% p! W  b
                               
登录/注册后可看大图
        CString appPath = GetAppPath();  L3 W8 `, q, ?' g

  S3 D5 r3 M# _$ X; L. K                               
登录/注册后可看大图
        string seperator = "\\";
* D( u& K7 b( Q: s7 W- t3 E& ?

& f2 V) s/ `+ ~4 D$ W& g- R1 W1 i                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
( m: a; o& i3 h# m, [: B% X* O

3 `' n5 i, A2 a  [4 H% Y9 }                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件
; c( Z4 P- L  f) Z, R
* G( t& c3 N8 w# m; B) m: A# D% Y
                               
登录/注册后可看大图
    }; s+ ?# ?- `7 R2 c/ q
# u4 f9 X( I; N9 P, M
                               
登录/注册后可看大图
    catch (string& e)
9 I9 i; }6 ?" S+ i0 Y! K
6 W8 p$ ~0 o' r; a4 m
                               
登录/注册后可看大图
    {) y& e0 j& z7 `" E9 {

0 ]/ ?7 y; j$ m$ r& F* J                               
登录/注册后可看大图
        return false;
7 G+ E/ L  J- t6 |/ x3 r8 k
' U/ q; Q, X6 D  N( {
                               
登录/注册后可看大图
    }- F2 L5 \3 J4 R  O& J

4 e0 V- b) t/ _" T* _  z6 B+ m0 y                               
登录/注册后可看大图
    return true;6 z% V5 ]3 r9 n) D0 K9 P
9 q, Q' s% F% i3 g8 R. r
                               
登录/注册后可看大图
}2 [2 c" C9 r2 e. m! J, m$ A" X1 m2 `
: M( _9 @3 I: b/ c' }
                               
登录/注册后可看大图

: n1 j' b" }4 {7 a; I7 v* w

3 F4 G* m. d) C7 ~, b8 n8 g                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
; W+ O4 G! d" f  R
) F. A" n8 D+ R
                               
登录/注册后可看大图
{//读取Xml文件,并遍历- D5 Z! u: l$ y* H5 Q! ?6 `
, d3 N6 ~1 [& j& S
                               
登录/注册后可看大图
    try' a& o$ y+ s; C' R8 _
0 \, g6 D  r7 E$ L7 E' ^1 E9 D
                               
登录/注册后可看大图
    {  Y' S. K3 @3 T" ^0 N) I# ]) I

: q' e( X% A# J                               
登录/注册后可看大图
        CString appPath = GetAppPath();( [0 A$ S; e4 c( D$ D7 |

  B8 l+ g. I6 O                               
登录/注册后可看大图
        string seperator = "\\";
- ^9 d4 q' I  l4 @  I3 i
+ Y2 L1 m, G& F7 p1 d' M
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
# m. i- [! v% ?& j; t2 J1 L
' [" v& Z5 K' l! P
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
8 f0 _; v5 i6 D, V6 C& x" d; @" s8 q
8 \6 D& A8 A8 H0 e" e
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());$ ?! c* s, `/ n) s4 E5 m
2 E4 x' M7 a, ^3 a* A4 }1 o2 g
                               
登录/注册后可看大图
        myDocument->LoadFile();
" N; F* p4 d& w8 Y

: L3 u5 n2 ?4 {- p4 \& J                               
登录/注册后可看大图
        //获得根元素,即Persons。
' C! k  o* O6 Y& [1 I$ K) ?

, X3 K' B. A/ U6 q7 F                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
0 h. B8 a& Q- M. l5 f2 y  j
2 f# |4 X# x4 V: Y
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
. R- C1 Z( E% L) s; O- n: N/ e1 K7 L
. b3 l' `" J& ?4 u+ k& Z
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;9 Y9 d. ~* L* P/ O$ K# q: z0 }8 }2 a
. v* G4 D3 t) Y6 e6 K& Y& @
                               
登录/注册后可看大图
        //获得第一个Person节点。4 m7 z/ S# @7 ]* q% r- h

8 `& D+ U# W& B5 x                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
+ P' u" e8 M. _% m3 b4 ]

7 u6 L* J* L) b( L0 v) C" X6 O8 e                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
( j. v0 W! \; @8 |" K
! C7 X7 O* F8 p) M' k3 X( l! ]
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
- x, Z6 s. l$ H8 [4 _/ }4 l: q5 S

$ f$ ]# c3 b' s: p  U- V                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
5 e5 D& n$ V% @7 h1 m

9 U8 N- K; I$ T1 `! G                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
1 F9 w& H' b0 P1 x4 L9 u
+ M2 E* n, n6 r7 H; ?+ I
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。( f8 `# k+ @! s. R- d* E) w- d
5 n8 R7 X& M+ ?1 S# p/ [+ s" ?
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;/ Z' A% ?3 i8 ~; m( U
- j0 j! u% d* J5 @( p$ a# r9 ?& v' m! Q1 ~% i
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;7 y/ X' P! R& Y
7 B! I. X: D$ P
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
) |. }8 `/ }" |0 o

$ t8 I% b8 W, T                               
登录/注册后可看大图
    }
' }6 V8 e) ]# }$ O/ R  Q, ?6 q
" ]% R: U# y7 Z' |$ M
                               
登录/注册后可看大图
    catch (string& e)  A. |+ Y; `: V2 [

) z" J6 a* A5 y; t" i4 C                               
登录/注册后可看大图
    {' Y4 j0 |; y6 `1 D7 D

+ l! E% O8 S  q/ D" a* A                               
登录/注册后可看大图
        return false;
1 C0 K. {! u! W6 o/ h9 i/ t

: n9 J1 N6 m$ g& s                               
登录/注册后可看大图
    }& s8 c' a+ F1 R/ G4 h3 Z$ Z# C

, b: E; B6 d, l! c2 {  ^+ f                               
登录/注册后可看大图
    return true;4 T8 `# F6 A1 p' D0 I' V

. b( ^; n7 `! ]' P                               
登录/注册后可看大图
}
, X) S" g' P- _# g1 ~4 X; l

% z4 |  U3 b/ |7 w  v9 Q1 z                               
登录/注册后可看大图
int main()4 j& k/ [% X# q6 d& L

8 b9 V. a8 R4 ?9 l  r3 K& D7 f                               
登录/注册后可看大图
{
* H, I6 u  ^! |. h9 t

+ p& ]6 d7 _, t                               
登录/注册后可看大图
    string fileName = "info.xml";( E  ]7 i! P. i

  e. Z; @/ B3 S4 Y" Y                               
登录/注册后可看大图
    CreateXmlFile(fileName);: l. c1 ?9 j% u
, G% K* X% B4 l1 d" Z: N+ s
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
, X: H: f3 m5 ^
; F& [. c5 T& i9 h
                               
登录/注册后可看大图
}1 k3 @: g% Q' q
0 p* w, R9 u" `& R: d) X, O; n
                               
登录/注册后可看大图
; p8 W8 d6 O! D( O, A. F4 _0 a
7 O* m6 W0 W$ \7 z8 W0 U" l) |
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
' X0 O& e( \# E. I; w! S) f
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了