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 4354 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片段:
9 ?/ M: l" _5 A

$ R  [' \: e0 P% l                               
登录/注册后可看大图
   <Persons>3 r. h- b6 t& h6 r

0 s  @. S" i: y4 B. D( B  y                               
登录/注册后可看大图
        <Person ID="1">* r( s2 f$ W- F" ?5 u  D- U

8 Z. e- w- g) Q& M# _# I9 V$ J; Y                               
登录/注册后可看大图
            <name>周星星</name>
) P5 W) r( F3 c, d; u  c
8 S5 T, ^% x4 i6 l. J
                               
登录/注册后可看大图
            <age>20</age>
+ o' v' B$ l& |3 o

3 H- ]3 u! L' }3 p/ Y                               
登录/注册后可看大图
        </Person>
  K: [% b% b! c- }
6 ~' p$ r; o7 a+ \
                               
登录/注册后可看大图
        <Person ID="2">
' J4 M5 }$ e: G) o$ W: ]

: s: U8 m8 p8 Q. O, Z& a' g                               
登录/注册后可看大图
            <name>白晶晶</name>
, n1 n0 M% {5 P

- C' `1 @' Z! E6 z' b                               
登录/注册后可看大图
            <age>18</age>, O9 ]5 S* G/ |, P  E
, Y+ ?; q; q/ F$ H6 X' Z4 I
                               
登录/注册后可看大图
        </Person>
+ @! z; C5 q# v4 ?( I2 q2 s

5 B2 e; b& ]  i) m9 V! Z                               
登录/注册后可看大图
    </Persons>& n7 v+ M7 f- Z# s6 m5 ^" f
, E0 c. b9 v& T
                               
登录/注册后可看大图
5 h$ m# D. ?7 ^4 l: W* @0 n+ z
在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文件:6 j9 ?* q0 `% \% W
, r- N" T9 f% U
                               
登录/注册后可看大图
<Persons>7 L* v, h8 G( B% F; x& j" D
4 u; E6 V( \4 ~, }
                               
登录/注册后可看大图
    <Person ID="1">
) D1 ]. A1 h* d; z" o$ H
2 |2 F/ W) Y+ r9 U
                               
登录/注册后可看大图
        <name>phinecos</name>- I8 ~( }" W0 D" Q- t! Z1 J
. ?2 l' ^  c5 k! U
                               
登录/注册后可看大图
        <age>22</age>
! k7 p/ O& f0 m( S9 s& Y. T6 R

9 r" b3 n1 j/ z5 w9 T, J                               
登录/注册后可看大图
    </Person>
  [+ Z3 F- A0 |8 M7 q6 B

+ A! x; [8 P; _                               
登录/注册后可看大图
</Persons>
6 {# [- S# j8 I  n4 m

, o" O( i9 Z7 {5 ?1 _+ i  b                               
登录/注册后可看大图
6 A+ P) D+ P) a# M6 ^
读写XML文件的程序代码:
, X/ r& j# d( ]

) O) G) V" m" `                               
登录/注册后可看大图
#include <iostream>
& w: {7 L+ F- M0 v8 B5 e3 T, e  B2 G
: F, l# Y& s/ v' T' h
                               
登录/注册后可看大图
#include "tinyxml.h"& g4 q( E* u9 G% [- g, c& G9 |

, |" x! X2 I! r' {' ^: |$ W                               
登录/注册后可看大图
#include "tinystr.h", i  N9 n9 C: o1 M! o2 H
0 Y: K0 t2 V+ }/ f* q! V
                               
登录/注册后可看大图
#include <string>
0 \8 f; P; I* Q: r3 z
- B! R- q5 V* v$ y# Y% L( }
                               
登录/注册后可看大图
#include <windows.h>
( S- r8 P& ^5 U- p$ y. S& ?
* M. E1 G( M( Z' w3 _$ g
                               
登录/注册后可看大图
#include <atlstr.h>, f2 l, Z/ C2 x0 w0 g
3 C& Z8 y( Z, j
                               
登录/注册后可看大图
using namespace std;
! u1 D' [6 x6 H1 a8 B# R& N' N

- N/ S+ _( o4 B% K5 |( Y- V                               
登录/注册后可看大图

% x" X. P$ J/ J

7 B$ c/ W& u1 l4 O( Z                               
登录/注册后可看大图
CString GetAppPath()
! B+ g- a+ n5 a7 [" O7 M
# X+ \3 J  c1 Y  v2 z# N4 F
                               
登录/注册后可看大图
{//获取应用程序根目录: b4 n( S" @# h
+ i- v% i" t6 W1 h
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];, W5 M: E- r; l- G( L* Y

! J6 D7 o* ~+ k1 r) r7 O$ L                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);7 f. `. o- s% x
* H0 g7 t+ k& E4 s5 o
                               
登录/注册后可看大图
    CString strModulePath(modulePath);
. Y7 P9 i# \0 D

7 D% U3 ?9 t" d                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
5 c( v) d' {% Y6 a! H2 z

, r; L. s1 t7 r. [* v! \                               
登录/注册后可看大图
    return strModulePath;0 o/ t. G6 g5 E% _1 f% w. E8 z& @  s
6 [0 g7 w+ o1 u/ v4 j+ G) H4 [" d0 g
                               
登录/注册后可看大图
}
1 ~" a9 o* A, n' \; ]

! w  B& |7 y6 B6 t                               
登录/注册后可看大图

+ ~  b3 y+ x1 p: n2 W  W
: r6 O2 T# x9 q& y" I
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)
3 E+ R) i3 C. n. Y1 n; I' N" h
, ^' F* a# x9 L
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false/ ]3 w; \$ Q6 X" e& ~# B- U9 U
; Z1 M4 s6 K# c+ l# y! y
                               
登录/注册后可看大图
    try5 U2 N9 D4 M/ x" I

" q1 d* A; @7 c* f, f- ~# J                               
登录/注册后可看大图
    {) O. h& i. _& w
3 O2 Q0 r- D! [' \
                               
登录/注册后可看大图
        //创建一个XML的文档对象。1 j- B% L1 s6 O( d
9 n- o. }4 Z; r; O% j; G
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
* d" ~! {) d' y( C+ q) e0 \
$ d, e6 b- q8 G. l. G4 h
                               
登录/注册后可看大图
        //创建一个根元素并连接。
9 ?+ ?8 c8 x' x: t  L+ ~

7 h: u# m+ D- a& t" r, L                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");8 a; Y6 h/ Z; b5 v
( Z/ H' J1 X( L: a1 T; H  }$ P, {# \
                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);, P! a& @1 H$ Q
2 b: H8 s# P: D% s# \% o/ P
                               
登录/注册后可看大图
        //创建一个Person元素并连接。; v5 V& F# O" ?5 s/ D

/ E! c0 X2 K# T                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");0 N- I0 f9 g, u) s& F2 F0 ?
2 A7 M9 _0 M6 f8 L/ D: Q
                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);# a6 h. t  {$ f7 m' X' B; y& p

. g+ L" V( f2 k' S+ ?                               
登录/注册后可看大图
        //设置Person元素的属性。
% v$ T0 h" l( r2 e# U

6 P# T; Q7 z" x3 \" h. J                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
1 Z9 W+ S0 D8 m' J5 O4 e

0 \! N# G1 |* Q% p# t                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
+ g3 F, _0 ^- n- _+ S' K1 K

6 g5 F8 X1 B# w                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
# Z6 z& }1 O3 H( s3 G; z1 \
- K' c: _& L/ W' ~  N5 I0 }
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");- h- i6 M$ T& Q# a

" P; I. |: I+ f                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);
( d' b) s. }5 S: H

% F- I1 ^' `9 @4 N                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
7 R0 j+ M3 O$ c

3 }! D; w4 V: k2 J4 t6 o% A! k                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。8 c4 Y+ Y6 i4 [! ~3 W4 Z

+ ?  v' @+ @& s0 Y) W  R                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
, d0 G( K/ I8 T7 m% O! D( R% j
+ R& e  O$ I( J! o8 q2 W
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");. N+ e  |% o- m/ q
. ?/ A7 o" C3 X) F
                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);3 T+ z/ D6 L+ z* Y( }

4 J  S( _, p/ L6 }* B+ ~, ?6 u; Y                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
9 t4 V) K) x5 o+ i
. G5 O$ o1 ~0 _; m
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
! a1 B, {" p7 U! b0 y: S
1 Q& b9 u8 C; S2 H$ {+ ?0 p. b' Z
                               
登录/注册后可看大图
        string seperator = "\\";5 z6 e/ R; N5 `& o3 W. Z( h: b5 w* l

  f6 u4 V# c5 p: u( R                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;/ t- V2 @' Y0 l; I
  J  N* L6 I' m
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件7 A( W% m  O/ A1 C& l' P, @
/ j3 f2 m# Q* ?* D. L: h8 D2 F
                               
登录/注册后可看大图
    }0 k1 U" s6 Z6 ]& u

+ R" l' x$ Y* Q( a( V! P! s. z3 p                               
登录/注册后可看大图
    catch (string& e)
  Y5 P) }7 Z3 N5 _3 \

, C3 v6 A; f- H& H3 b+ y6 H; J* E                               
登录/注册后可看大图
    {* k0 h1 F6 w9 t( v
  o2 h+ ?1 f7 G- M, d0 u
                               
登录/注册后可看大图
        return false;
/ d! ?0 g/ M+ E4 h! N5 L& E

6 y+ k0 ]' B! e1 \                               
登录/注册后可看大图
    }
5 s- ^4 S1 U$ l/ Z% Y" k4 ]2 K
5 ~5 t/ t( d# z
                               
登录/注册后可看大图
    return true;, M; H2 y2 L2 Z% U

  C5 _& x" |+ ^1 X2 G* o0 s                               
登录/注册后可看大图
}7 l$ X1 W' W2 s+ r# S  K
; F. g1 Y/ A4 p) T
                               
登录/注册后可看大图
! Y1 J' J% W9 S) ^. G
* o# q3 j2 x& V, \
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
$ ]* a! h) _$ ^2 u0 `8 Q
. R5 b0 A6 d; ?+ Z$ ]
                               
登录/注册后可看大图
{//读取Xml文件,并遍历
3 A9 D. O! K$ ?; k5 C/ S/ _

* l2 o$ E0 h, }2 F4 D2 W5 L                               
登录/注册后可看大图
    try! d4 {* \& s1 C) v
  r8 f# b+ W( _  c
                               
登录/注册后可看大图
    {! L- H: y: X5 ~! Z
1 p2 s+ s5 N) m
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
, I( C! v( {( y) }
* i& n" u+ L" ]+ u8 K
                               
登录/注册后可看大图
        string seperator = "\\";
/ [3 G" s0 E( @

# U9 T$ n! V* }1 [                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;* h9 _4 D* f( o/ I
% P" e# C! E& j8 Z6 k* n2 d* y
                               
登录/注册后可看大图
        //创建一个XML的文档对象。
  N; o2 f7 z: y/ s

* X, k$ M! H4 B! |: ^                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
" C3 H* x& j; B; T! f0 ]

; H7 y$ e) X" j% ~                               
登录/注册后可看大图
        myDocument->LoadFile();
+ S  l8 B" }4 q2 w6 @+ L7 w- W

" L$ v+ r9 D* m- u4 V                               
登录/注册后可看大图
        //获得根元素,即Persons。
8 L% ?3 {/ R/ ]9 T- x1 B

" z" p9 w* a  z+ i2 D) a( R                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
1 J) _. D( T# U# D" N

2 v% S0 z1 i: A                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
$ V7 H( a2 ?2 `' {6 c

3 V" X5 C+ c$ m) c% h                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;& M2 S% I/ [  T! M7 J, [8 c

; R( ~1 d9 }3 _$ [! C4 V+ {2 }                               
登录/注册后可看大图
        //获得第一个Person节点。. d) M  z" N8 H) [: R0 [

2 ^/ H# ~  s4 t8 p, T                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
9 ?; U" V2 n  {( q+ |' F& _2 K/ P

$ y! B& ~& e. B# p9 x                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。4 R/ h2 `4 [) ^# i5 W

4 r8 X2 c- F/ `' H7 c' {                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();+ G6 w" R* _% @* J( r0 H
1 f* s5 S$ \3 n* j; H; K
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();1 P4 J) X7 O* x) a" q

) q/ T- Q( \% J4 I' A9 |                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();& G3 ^( k2 `! E* S- B3 \

2 W" p0 s% o" n0 |* q- Y3 r& ]                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
- Z; V% D5 Y5 l4 A- J: g

. M, j7 h: A6 Y$ i0 h4 r8 u                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
2 R- w. `( W, N  S" c! O! ~5 g
8 A1 Z. Y9 O7 x4 I! Z
                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
3 `6 S8 ]& e, ^( r) s; W
2 E! o: B7 c- M$ h9 T- L3 W% c
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
  _7 q8 s& L2 q. H; G

- D; x) q- }1 M/ P) z& h! [! {                               
登录/注册后可看大图
    }) o3 E  n  T1 n4 i( o

- C/ x1 ~6 m1 v% |  o                               
登录/注册后可看大图
    catch (string& e)6 o- P" t& Z# O% ^# f2 P

, |, Q( k1 l( o9 f$ M" [                               
登录/注册后可看大图
    {1 u: A7 P0 t; {

2 Y7 s+ W( ~. T: l5 |                               
登录/注册后可看大图
        return false;
- F! d8 V8 ?1 J! C( O) O
7 V" m! ^; }8 q& _2 W# K
                               
登录/注册后可看大图
    }
6 J; }; D( a/ A8 ?: l

7 X: b9 Z6 I) v3 Y7 y                               
登录/注册后可看大图
    return true;
( ^0 l1 K" K0 l; c
; d8 L1 \9 _" V5 X
                               
登录/注册后可看大图
}
3 r0 ]; H' J' g' c0 _2 ]

6 b% _: }0 G" u. u, m" ?2 o# j# p                               
登录/注册后可看大图
int main()
& q- x+ B2 d+ k, x; h* n
! O3 Q7 q, ?$ x& b9 {
                               
登录/注册后可看大图
{
1 v  m, ^$ ]- _! N. ]' W
! [" Q, l- c6 F3 m
                               
登录/注册后可看大图
    string fileName = "info.xml";
* u8 y; D4 X( `- S' U  W
& d5 f- j$ V& U& k3 ]; F2 r
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
( r8 p0 D% {1 }1 l

9 O/ q' M3 n! _$ L+ w                               
登录/注册后可看大图
    ReadXmlFile(fileName);' @) m8 @6 o5 X' J

* J* T2 r4 y2 D! Q' Z; q                               
登录/注册后可看大图
}+ H1 u1 X8 V0 I% \' {; u" X9 e

* @! O' B7 W, ]- T0 f- h7 ?                               
登录/注册后可看大图

( H. b6 `9 v# S* n! p3 r0 I! |9 c
5 l# L( h. w/ ]: X% X2 Q0 Y
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
; J! G3 i# q8 i+ n7 u8 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二次开发专题模块培训报名开始啦

    我知道了