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 4344 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( P' n1 ?) w5 \9 @

/ k/ B) C+ a1 G# |9 _/ g& K                               
登录/注册后可看大图
   <Persons>* |8 d" d, z( |8 z  N
7 q. C; F/ W6 c7 [8 M
                               
登录/注册后可看大图
        <Person ID="1">
$ M1 Q1 L) [& ^2 b# T
1 f; \0 U8 s: z) y$ [4 S& D2 I8 z
                               
登录/注册后可看大图
            <name>周星星</name>8 a( N" D( T- v3 N4 [) A+ n) b

& n; T& n% A/ b                               
登录/注册后可看大图
            <age>20</age>) t1 m; N* N% \" R$ E& U% [! ]. k
! j+ C& m) m4 k4 ?9 i/ v. M, r
                               
登录/注册后可看大图
        </Person>
2 K5 O% s  V& ~5 F  D$ p6 `
  a$ s$ h: x' Z' \: z
                               
登录/注册后可看大图
        <Person ID="2">
+ j: x1 G$ e  X$ u) H% n# Z0 q
3 i& x4 n. ?; E3 s5 i1 C9 q
                               
登录/注册后可看大图
            <name>白晶晶</name>3 ]; N9 B6 t% n5 Z. L/ r! w

- ^: I; |5 t) y                               
登录/注册后可看大图
            <age>18</age>, k6 x6 w3 L' V# L
% A$ U' H4 @8 v3 i) S9 u
                               
登录/注册后可看大图
        </Person>
) O" a; I! l, `  f5 D+ Z0 {

" x1 K. ]5 l+ M, K- z6 b1 e/ ~                               
登录/注册后可看大图
    </Persons>$ ^  b" L. J6 ]4 A" W- L9 w! P$ U  p

6 `# `9 j' y+ P4 J                               
登录/注册后可看大图

9 ^5 B1 I- o0 B! G- c% B* Q7 B, K
在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文件:
* b- t. n8 }; ]% Q7 S+ }
1 `, ?# K" t7 U( X0 l8 @
                               
登录/注册后可看大图
<Persons>: U: n# ?! L$ P* C3 d4 z) H

, V9 w" u$ o3 U: F                               
登录/注册后可看大图
    <Person ID="1">/ p+ \6 v0 S6 x

5 D9 W; U4 v' q& }/ a) [                               
登录/注册后可看大图
        <name>phinecos</name>
( X% f0 r3 q3 b$ b! H

0 N8 |6 O- R' n& ^  j8 Y2 j                               
登录/注册后可看大图
        <age>22</age>* V0 l, p* s% ]: C4 c1 b
7 M! o7 z* }4 X. w2 H
                               
登录/注册后可看大图
    </Person>' F- \' Y/ V8 B6 y

" |+ c- D5 X% B, G7 N1 L6 J; O4 C                               
登录/注册后可看大图
</Persons>
2 A- I/ |' W/ q

3 z! f: z% V9 r% [                               
登录/注册后可看大图

  R7 h; h4 o2 ]
读写XML文件的程序代码:
5 m5 ~: L* W, Y1 n/ F, ?

( R  L5 |( o0 l# S9 Z                               
登录/注册后可看大图
#include <iostream>& o7 @1 S0 \$ v. ?

. H- K* \% o5 d- a3 L8 A- }                               
登录/注册后可看大图
#include "tinyxml.h"
5 m, |; T. v- M

* [* c1 L7 B2 y0 o/ ^                               
登录/注册后可看大图
#include "tinystr.h"
) \) T+ ^2 Y! G! B: W1 O" K
% g2 a8 Y0 E! Q* |; D4 u
                               
登录/注册后可看大图
#include <string>- a+ t" b5 r! G3 n: t+ m
- c& ?# }  c$ L; e) }! o; [
                               
登录/注册后可看大图
#include <windows.h>
0 W1 `! P' M8 i. g7 X. \4 H

+ P$ _& ^- @9 h                               
登录/注册后可看大图
#include <atlstr.h>
/ c  _7 L% ?  s8 \8 `
* {6 n5 s5 o9 t, S. N
                               
登录/注册后可看大图
using namespace std;. ~2 ^1 u& p2 P" m
! c* T4 N4 {5 l% c# A
                               
登录/注册后可看大图

6 O/ l. C" ^8 E; p+ |' b
9 C# U2 i4 m1 F) s4 ^0 u
                               
登录/注册后可看大图
CString GetAppPath()
' X( J  d4 E- [" X
. X: l: V: H  x6 K3 M! {( y
                               
登录/注册后可看大图
{//获取应用程序根目录
7 h5 e0 j" {$ U9 U4 }2 H% a
# q* Y; i& u4 c! A
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];( k8 c/ A& p3 n

4 \3 i3 T! M1 V4 \                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
9 b6 {- N" l! b! G8 f

+ K: G) N) ~+ L                               
登录/注册后可看大图
    CString strModulePath(modulePath);
5 S$ [9 _2 I' a
# L  C4 P% M8 b1 v. J, e
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));( k& ^  b) u% P4 }0 n& }

+ c9 @  w* p0 s                               
登录/注册后可看大图
    return strModulePath;
1 o8 \! b) r* z& c

& K  k) ^# E6 k7 n# T" ^                               
登录/注册后可看大图
}( ]( i5 q. [1 l$ l: d0 y
; N/ i* _2 Y" F9 z  c
                               
登录/注册后可看大图
" f; J0 B* j& ^9 \; r7 h' B

4 ^! s% O5 t! H3 B" r                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
/ ?9 D/ W' I5 D. T7 V

$ f4 r6 j9 E% K% m+ Y& W* L                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false: k, m+ e. K5 O, }

: X6 I, f2 z3 ~, r, q9 n                               
登录/注册后可看大图
    try0 _$ L8 x! ^$ J( Q+ a
; \+ u. O8 {1 B9 Z
                               
登录/注册后可看大图
    {
5 c, O0 _4 W( P% M
) z* }$ |- T/ j3 F
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
$ a/ e- ^5 d0 V+ w' O& \

' X; j7 J3 ~/ H) R/ M% m                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
0 w: d) I) Q, s" b% }' b
- a1 Z  [/ T# a3 `
                               
登录/注册后可看大图
        //创建一个根元素并连接。0 J( j7 m4 P* w5 F! p. g

* t7 w) M3 k, n$ ?* E* L+ l                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");
+ e# I7 u2 u4 F) z$ o. `

' S" c; d/ [9 s& T+ Z                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);4 Q$ j* @: Q. E* p( r
4 q' E. i! m: W0 C/ y
                               
登录/注册后可看大图
        //创建一个Person元素并连接。8 ?! N" I* G7 u

+ _. g% f5 [' ~# H- Q; m                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");
% M8 r. z4 t' U8 ~: \
* n  \: R- n5 @1 {% J  L
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
  v/ p: U$ ?7 t" t8 N
( D2 N0 M! T2 H# M
                               
登录/注册后可看大图
        //设置Person元素的属性。
% S/ J. T* R. e! j) V$ I( x6 P

6 a% E/ A  ~6 o$ K, T7 j                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");& v% N! K1 f/ r0 J  ~$ |2 J1 n4 J
3 I+ N0 N7 E7 I- Q/ j
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
# K- d9 \( ^4 o/ s, f% [

) H8 o2 R) R, K& V  v& P                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
6 E  }5 w. E5 R# j: R5 [, S
, w5 B  }3 u# p) t9 K. q2 e
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");* W' a% _) U. p
% C- O7 S) V2 v7 y
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);$ c2 B7 e! P  `1 X

' U; D  t6 V1 E- `5 Q                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
" x# B; r+ q3 r. L

- ?5 k" w" Y& n$ I                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
7 ?  B, M  a5 o+ U

4 t  q; {& ^0 }  |# e* b* R) t                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
0 Q8 l3 {& E8 h

0 V( S# o( x9 \. \" d7 s                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");7 O- o2 ~+ R: y. Z
) A3 {+ x# `* H2 S
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
% [: L5 n8 e6 c- `4 G# R1 {
4 l. E6 m8 c1 ?" C
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
9 A9 j& ?5 }% z$ c9 U

: q- J  A7 i4 R                               
登录/注册后可看大图
        CString appPath = GetAppPath();
- O+ n+ B8 s6 S5 d5 n8 \7 m6 w& D

) j+ Z6 P! x" y1 G2 L' d                               
登录/注册后可看大图
        string seperator = "\\";& P, A+ T) Y! R3 p! t6 E8 k4 Z
: w/ W  G9 Q3 p5 A
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
6 s; n% I) w; \; s% B

% [7 S1 F) x. T# [- Q. O                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件& G  V1 L7 W! [' q8 V6 n+ n
# D  t( L) B! ?4 T& ?! t
                               
登录/注册后可看大图
    }
( A' J) Z$ L& @* C0 H* _

4 _% t  n1 y" M+ J( C2 [$ D2 i                               
登录/注册后可看大图
    catch (string& e)
6 k' k; \% ]$ u  @

6 y8 m9 @9 n. y- H# ~                               
登录/注册后可看大图
    {
5 f- q+ C2 `$ Q' F& k. B# E
1 i" b4 R* d- s* ?1 \& K5 t6 m
                               
登录/注册后可看大图
        return false;* G1 c+ R2 r. C5 I

% t3 i  H; B/ A                               
登录/注册后可看大图
    }
4 r: z- o  @! w9 S; o# k

$ x3 C& j) n+ q' W8 d                               
登录/注册后可看大图
    return true;, ^1 k( z) W$ K8 p8 M
9 u8 A& V8 J1 Q6 a9 P
                               
登录/注册后可看大图
}0 y3 M5 X& d( l: c: k7 b" v" w
6 e2 ?0 C4 p/ W' H
                               
登录/注册后可看大图

1 e/ ^' u; b4 a' p2 M
% m4 v$ U# m; _1 o. _" l
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
3 O% }$ A  f% y+ M! h) d0 D0 U

/ \4 q) O% a' G4 `! ]. L4 M/ B                               
登录/注册后可看大图
{//读取Xml文件,并遍历2 C" w3 }3 J7 l0 E8 U
3 U; a, X* c& ]4 ?8 U
                               
登录/注册后可看大图
    try  ?2 J1 t  A) R$ `- @, q  E* [
" y& A# u; Q; D3 P, }
                               
登录/注册后可看大图
    {% k# |2 l" n. M% d/ {

' s* k. F) m8 d7 C% U2 Z8 C                               
登录/注册后可看大图
        CString appPath = GetAppPath();1 Q- V& s  R. m; u9 w
% G8 z' w4 m% f
                               
登录/注册后可看大图
        string seperator = "\\";2 v) v! y1 T& C$ \9 B! Q5 U; L" q
' E6 z0 [. H' m; O
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;4 }$ ^/ h# @( s: h

9 f8 R& x. H) i, U                               
登录/注册后可看大图
        //创建一个XML的文档对象。  V2 m9 j' T, s" n  C# _
& i5 R8 c) r! a5 {9 V. b
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());/ ^7 P' ?" ?1 h, u! c
6 @* \  ?- f( z% r, |! q
                               
登录/注册后可看大图
        myDocument->LoadFile();: C( T4 y9 D& Y2 S
! w1 v1 n5 Y/ b! h3 i0 X* ~
                               
登录/注册后可看大图
        //获得根元素,即Persons。
6 K! g1 s8 @; U" K, l" T& s2 C5 k

5 ]1 I8 L. F; W- ~8 ?$ \! D3 V                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();0 F) \7 ]% {$ D! h  Y

  t6 k, l9 K3 H& l$ R* U% [9 G& \                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
" m' {3 @" i. n1 Q' _  ~

4 u# d! E- R* m* v                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
' o# h2 G0 l3 N; L/ G  x

; g! w( k5 i5 ]. M3 l! E                               
登录/注册后可看大图
        //获得第一个Person节点。3 L* p  R  k- N9 f- n

' c$ w- ^$ B3 f' N. w1 c( f% b                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
! B* ^5 T4 v6 I' ]  ~2 P

- {2 O+ V; s8 B                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。9 [/ J5 c+ I5 D2 O3 H& h( O: \
7 m2 U* Q# z; C( K7 W
                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();4 t, A. c  d% O1 [! l: h' ?
) j, |+ E3 p; l1 J' r# `+ W) ?
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();! r9 B, F9 _/ V7 {1 L# \

$ `1 R* u6 D# Z1 J  d3 W                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();, S/ _/ j% X; |0 V! r7 K
) i  J% M4 S- ?3 v  t* \0 M" x9 x+ ~
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。5 k, i2 a6 Y9 _7 w9 c) f  d
! t! R! {: p% b" ^2 \7 B
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;% P7 q; w% b5 u
- E6 H9 l2 S1 @7 Y  S4 c% J; q
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
" J# h$ K5 U, t* G/ p. g8 d# f% z
+ M) X- \9 u( s8 c0 M
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;7 y" z1 Z* N1 M8 h1 q0 G
6 w/ R# k/ ~/ C9 p+ ?* P
                               
登录/注册后可看大图
    }
0 y4 \) o/ P+ u0 P: @8 a
$ @$ I1 \: g% Q# @5 ?% K
                               
登录/注册后可看大图
    catch (string& e)
* ^) }$ N" Z. [% X
  A% k* A9 P. R8 P! o8 J4 w% |
                               
登录/注册后可看大图
    {
( g0 f: D& `' p. m
# f' \) {4 `" E% t+ T
                               
登录/注册后可看大图
        return false;
0 {" h8 H+ k3 ^, v# v

4 [9 C! {, l# v$ f2 t! c$ _                               
登录/注册后可看大图
    }- [/ E, g3 M) v" y$ P) a+ Q2 X
" Y- Q: h5 a- j7 v( J
                               
登录/注册后可看大图
    return true;5 o% j* U- ^. R2 A* e* W7 s- w
3 ^0 G' r5 A/ y; Q
                               
登录/注册后可看大图
}8 Y! e9 O5 O% D7 M6 ~

7 v* i( D) E' e: A# j, w6 Y# Q                               
登录/注册后可看大图
int main(); O( ?- v$ R1 V$ L7 v6 T8 f- ~
5 p: n* j2 Q; o% q
                               
登录/注册后可看大图
{  E) B" K, p2 Q' J
& j2 A5 I. t! |7 D! X1 }1 l
                               
登录/注册后可看大图
    string fileName = "info.xml";- ?( V% \* a# z

& ^: S; V  y% \5 E; |2 o2 w                               
登录/注册后可看大图
    CreateXmlFile(fileName);/ Y" w0 x6 L3 S
7 D( G5 C( [4 Q6 X$ e5 ]
                               
登录/注册后可看大图
    ReadXmlFile(fileName);
1 \2 B1 n$ N: `. T1 Z# p9 s' k
. g- g7 A3 D' r. l( b
                               
登录/注册后可看大图
}( i) T6 @1 a4 c9 `8 G4 K7 f
# A* y5 W9 H, t! k4 M
                               
登录/注册后可看大图

; ~$ s+ `; i9 I: F7 ?  |# h6 |8 [& _3 L, G; U
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  # @- c) J; u+ E+ a/ _( ^& S
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了