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 4324 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片段:
/ F0 s+ k3 i& M

' n1 v9 T! }, S% W! Q                               
登录/注册后可看大图
   <Persons>
0 h2 K9 h3 M' H3 g5 v/ P
3 O7 p3 b9 ?( v9 ]. W' r% ^) U2 U
                               
登录/注册后可看大图
        <Person ID="1">) C; h: H5 X' h0 ~. A9 ?# y
- V5 ?5 Y: l: p  y/ T/ W
                               
登录/注册后可看大图
            <name>周星星</name>
: Z5 Y8 K: m+ r9 a" r' Z

- v( Q/ j( G" P' r3 ?8 {                               
登录/注册后可看大图
            <age>20</age>
8 S, Y4 c5 ?, S' m+ j
' D1 X( ^/ E# o& |5 ^
                               
登录/注册后可看大图
        </Person>
7 Q$ ]; \. i# `. A5 p

4 l$ d1 h4 Y" L, P+ O5 s0 c+ h                               
登录/注册后可看大图
        <Person ID="2">/ y3 n* `! v) Q$ t& D

3 u5 I5 n% T$ J# E! P7 m# b                               
登录/注册后可看大图
            <name>白晶晶</name>
8 t. o& P, c, a8 h+ z/ a

( ]" b- K; \* c  X' j+ D4 N; g. Z                               
登录/注册后可看大图
            <age>18</age>
- [. L, U2 O6 p* T+ Z
! S7 r8 K9 F0 X- p+ _- f. Q
                               
登录/注册后可看大图
        </Person>& R2 D+ i# s. ?5 L# K3 [

% |- k" g: F$ z2 d9 X- t                               
登录/注册后可看大图
    </Persons>, N% I6 f( {) q( l
& N3 P  Y0 t- c4 d1 X( Z
                               
登录/注册后可看大图

& I% p: H9 f  g) w6 Y
在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文件:
- O$ S' M+ z0 f( ?; {

6 C; t7 _4 l4 O( g/ i9 B                               
登录/注册后可看大图
<Persons>7 q8 R! Z6 x2 C- G: B! D

9 A5 a" D% z" l. M3 k, s& }                               
登录/注册后可看大图
    <Person ID="1">
% F: }; j9 o+ b8 ~& ^
& m  F) ^& m* z8 O, |' r! e
                               
登录/注册后可看大图
        <name>phinecos</name>7 J  p) y3 d0 s- w0 y/ I9 z( e
1 X7 J- M* k1 l1 f/ M% _: [0 S% x/ h
                               
登录/注册后可看大图
        <age>22</age>
6 U. t4 l% q; M+ v& a" v- ~! F: @
" D3 y5 W& @8 ]) h# t( F
                               
登录/注册后可看大图
    </Person>
. `7 B2 S! }: F# p; `" B: m

  A: G& h% x5 q: a. |6 I                               
登录/注册后可看大图
</Persons>
# E8 k1 F" U; o
/ k. [/ Q4 T0 M# k1 o) l( q# O: a
                               
登录/注册后可看大图

, n" a5 {; T, k
读写XML文件的程序代码:
' F- k% w' g0 V7 g2 N

% @3 V" {9 U1 o" G5 l3 k0 S, w                               
登录/注册后可看大图
#include <iostream>
9 Y. V( A  P1 \, x4 o: S# m( A& K

  y$ i, @# `' n0 Y! u; F* ]1 ?. Q  {                               
登录/注册后可看大图
#include "tinyxml.h"3 Z/ d. g2 j  X% W6 n  l
8 R# U$ c/ p$ K  l$ E+ f6 Q
                               
登录/注册后可看大图
#include "tinystr.h"
$ X. |9 J# ?2 _0 F
1 m6 _" r9 D  f+ u" X
                               
登录/注册后可看大图
#include <string>( a$ C! g$ G$ _5 |) S  L4 R
! Q# [% b6 g+ e$ e
                               
登录/注册后可看大图
#include <windows.h>! Z3 E* q) M) {+ c  ?. a
* u: u9 |/ J, q* B: X% @6 x
                               
登录/注册后可看大图
#include <atlstr.h>4 U& k8 _' x+ P  e
8 F+ e! x0 q% k( |! W- ^! g5 q
                               
登录/注册后可看大图
using namespace std;6 c0 ^+ l8 m& x/ [9 p

9 f* T5 e% s' U$ J$ D/ M+ K% B                               
登录/注册后可看大图

0 {: D1 x1 e, I9 W8 s' p

+ h" j" k' B5 f                               
登录/注册后可看大图
CString GetAppPath()
! v; D& X% [" i2 S. Q) n( D* \

5 p; O; _$ v# x) z0 e1 {, q                               
登录/注册后可看大图
{//获取应用程序根目录7 T( ^6 R* t# Q& B7 }- O2 S0 ^" F
) V/ z: `3 g3 o
                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];( s+ N% Z1 b) q9 h
% x9 ]8 Z* e4 @* E, ~% K
                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
  s7 z% x* M) I( A7 h, a
4 w: I6 }: w( `2 I5 \5 q$ Z
                               
登录/注册后可看大图
    CString strModulePath(modulePath);% |& [9 T2 Z$ x- O/ O% N  x* \
! A9 ]$ g% P- J8 Q7 {
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));2 a0 m% {4 k, {9 M. G6 ?

1 m7 e' E# j, v# G; m' a- H. E                               
登录/注册后可看大图
    return strModulePath;& p; r- w) I: m1 e7 v' N! v7 x
% a! O9 R% m, Q2 x9 I" L2 S; B; _
                               
登录/注册后可看大图
}- c5 u$ D2 U0 T2 o( |& p- w

  @2 W* A! L0 t! a% H( m. q                               
登录/注册后可看大图

* [0 R, {0 w8 m7 M5 w8 n

( }! M  v' Q; w) X                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName). R( b; {4 A0 a6 u' k% L
( N: s1 C' Z8 U. q! x) X( H
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
! P: a$ O  R9 o: m+ ^
- d6 [" m) o* q1 L( j8 X3 ?1 P: O
                               
登录/注册后可看大图
    try3 p# B$ W: e! J% z" Z' D/ D

/ `# y0 l; I& ~: h3 D2 e, z                               
登录/注册后可看大图
    {9 ~7 \' v; c4 r

: N% P  ]5 Y7 b' r/ }; g6 G                               
登录/注册后可看大图
        //创建一个XML的文档对象。
# M; G# n* H$ U$ P7 ?) c# E
7 N& j; m2 N! e0 Y
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();, }! W; ], \# d! s% D! j/ R

4 @* h, b( `9 X. V% v; `3 z                               
登录/注册后可看大图
        //创建一个根元素并连接。
! j' g& K3 `* o) x2 v8 `
- P5 H. E0 u+ k' v" V" X7 e
                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");" T# e# j7 y& {2 |/ p

+ O8 W8 G& d# I- E6 u3 Z( G                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
% t0 }0 L5 F" m& Y! `
8 O' e9 b9 h/ \, D0 ~# v$ F
                               
登录/注册后可看大图
        //创建一个Person元素并连接。
8 t  z& X* C0 P
% u( F8 @! Z" d5 u1 q/ U7 P
                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");- I5 o; X2 q( R3 O  q2 `+ K5 k

9 U, K+ H, v4 h$ }                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
. _9 ~. H3 D# A: l$ I

/ b) j1 B& S% X( T                               
登录/注册后可看大图
        //设置Person元素的属性。
! ?5 x: l. s6 y0 N/ x

! m; U5 x; C7 k( F' V9 |4 q$ p9 Y                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");
* g8 z* e$ t& ~! C: \% T
6 b9 s3 H" `7 d7 J. D
                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
* P8 i, k8 B9 u, V7 H

* T: e6 {( G2 j+ z9 C                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");
# N) O$ {5 `8 w! n1 P8 {# `
+ R) P+ V3 G" h6 {* b- H/ j
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");. t4 }9 i2 _, f& H
' T8 t4 ]4 B7 l% r
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);7 \/ a3 b) v; d
0 J% D1 ~. u* `6 `3 |8 l
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);7 Y/ w* |( |( o7 D9 R5 |: v
6 x4 _4 u; `# B8 b# |; I
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。( y0 t1 }! r5 l; K6 c- e

& x0 _9 }0 B5 l, b1 W0 |                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
2 r# x. G' f1 ^# R3 g2 }' S
3 O: u4 J1 I* ^. J. Q. H
                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");7 Q3 `" L6 d+ c% W3 H! _- M

/ o, b* _; |( b! m+ o' x                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
; N: h5 z4 p" f" G  O6 u8 v0 [

( |: E3 L2 n6 h6 `+ A1 b                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
) |# L6 s/ n6 ]  j7 i; M
$ j, T1 ?, ^% I/ x( l
                               
登录/注册后可看大图
        CString appPath = GetAppPath();7 Y, [4 S, b7 H" K; W% P
9 Y. K, `# T/ m& `# b& L
                               
登录/注册后可看大图
        string seperator = "\\";
/ M% z& e' _. x; U# P5 b8 U/ q' ^+ m
) e9 v5 ^  l( k5 s
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;8 Z; G/ x9 H- v8 I' D7 w- C$ h- P

  p' ~" M1 d& K                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件! V7 J& D/ }9 E3 ?- R9 ?
2 f% J4 b. i/ z& ]: G/ [! _
                               
登录/注册后可看大图
    }
6 ^" s, h' v8 ^- F! q8 r
0 k, @4 a; P# b% P
                               
登录/注册后可看大图
    catch (string& e)% d5 A0 u$ d! q2 G( R7 R5 {
* i% C; z! H2 T7 U* \" J. O9 B
                               
登录/注册后可看大图
    {
1 W* g6 h9 @: \; `) N$ M
8 e' x& Y6 ^  d) h- t
                               
登录/注册后可看大图
        return false;/ o4 }3 y! T; e# ]

; z- |: i4 O7 `% \5 |                               
登录/注册后可看大图
    }
$ N) t. ~" X- m' o0 m* E
- |; U2 a# Z% S. u
                               
登录/注册后可看大图
    return true;
, `0 S. `, Z9 T  n3 c5 V( Q1 R
; H4 _- G3 Z+ q. q7 @3 x2 C' [/ r
                               
登录/注册后可看大图
}( L3 K1 C8 A( z# g6 q3 Q
) \6 v& k6 v- n2 u- O, N' ?
                               
登录/注册后可看大图

: @6 M* t0 x  m) b# Y* d) S- |2 i) J
2 |6 Q+ }* q9 x/ Z1 s8 a
                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)% V  N. J! m4 \! u( [
* M# m; U. l' r: v1 }; l0 ]3 i
                               
登录/注册后可看大图
{//读取Xml文件,并遍历0 B, q  B5 J# _# T

- t2 C! r; A9 j7 d7 l" k8 F                               
登录/注册后可看大图
    try
+ `, Q& X  ~% S  |. V
3 A" K/ l5 B2 a$ G+ c' s
                               
登录/注册后可看大图
    {
& o3 j# z1 C' X, h
7 L6 O8 R3 T  c) k/ t
                               
登录/注册后可看大图
        CString appPath = GetAppPath();
& _, g* A. ?  k& p, z1 X: R5 ]

7 n1 K. F2 [/ G! T. t0 o                               
登录/注册后可看大图
        string seperator = "\\";% S1 @0 K  ?  R3 v

6 f* {- Q8 g+ n$ n2 Y, ], P                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;/ Z# S1 x* Q% v
* a; X7 m" a4 e, A9 Y7 [
                               
登录/注册后可看大图
        //创建一个XML的文档对象。2 C0 ]( g6 C2 k! y9 k% T

7 }+ \9 y' C* Z, a/ r' ?                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
2 Y, Z: p2 f; H: _- u' F" I
5 t3 E7 m) n% P# l2 u; F1 L( R
                               
登录/注册后可看大图
        myDocument->LoadFile();0 z5 p5 N9 D1 _4 L. N" D  b
& z6 i+ B! \4 ^, K7 N/ L
                               
登录/注册后可看大图
        //获得根元素,即Persons。
2 s! e) \( M: f+ B; ?2 ]; v) m

* A& Z. j1 s1 M; H  ?                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();, M; `6 Q. g# l$ j
2 ]  @/ P* F; c) O$ p
                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
/ E( `' c' ~  ^

- m. m3 o' }' h2 W. p5 m: ~                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
; I2 u$ J( o' C  E, |- z+ y* j! \, q
1 M+ _$ }2 G1 @' L
                               
登录/注册后可看大图
        //获得第一个Person节点。
( x  K7 }) z- ~

  b# Q& v) C4 E+ U* v, o& S                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();( N5 d* z2 E- v. O; L) L$ Q- v
& y/ H: s7 O( x
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。
, y2 q3 i! {- s8 o; C( A  F# q) e

) {3 P. r% v% I$ u2 V3 x  w                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();% ^0 J+ o1 a4 L8 l7 f8 u% \
% K% i3 J- J/ P. o% T
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
/ k' @7 w4 d9 V' z3 b5 q' s
7 R, M' @% z1 {. }9 Q
                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();6 }) |# Z3 v% v) z4 Y
3 ]( Y& [& V# F# b( S4 c
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
8 H* T/ P4 k3 G" `" x0 \% `$ g; Q0 k$ l$ C
4 v4 g4 O5 W7 K. G4 ?
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
1 b3 r' w2 {7 ^  X  G: Q' E8 T

# x5 }/ l0 ^2 A7 W: {! E8 j                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
. b! |* u0 D( E! G7 i' S

- i2 k3 N: k# C! O8 T                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
# A% F1 y' M# o2 c9 R1 Y

7 E2 M5 K) Q" M1 x; Y( y/ _                               
登录/注册后可看大图
    }
7 b, e3 T9 ?  ~$ |4 U7 e% h

$ Y4 U% @# |6 Q2 [. K3 C0 W9 v) Z                               
登录/注册后可看大图
    catch (string& e)
2 d1 @" m7 C' _6 a; K8 _! ?4 {
- n' ~; u- I6 w
                               
登录/注册后可看大图
    {
- p/ C9 M  \* k

+ J' T0 E: E2 E                               
登录/注册后可看大图
        return false;' l- {6 F* L, @3 o# Y# A
  {4 H; L) U. V/ P  s/ O! y
                               
登录/注册后可看大图
    }
8 |8 s9 ?4 f" I. }; a3 U
& m' C1 G+ W. Q. C* \
                               
登录/注册后可看大图
    return true;  O" s8 F( Y! m

% R7 U9 x+ I( f0 M# ]  @                               
登录/注册后可看大图
}
/ q: G/ K/ _4 P' I/ l

7 W) s7 K; X' l% A/ Z6 A0 b                               
登录/注册后可看大图
int main()
* m- L9 f$ l, g0 W1 V2 H) ?& _

2 P- K7 D  t! H, Q8 |, ~$ M                               
登录/注册后可看大图
{3 {7 n) R$ O4 j
0 `) \9 M9 i. f" k" b! w4 c
                               
登录/注册后可看大图
    string fileName = "info.xml";! U. C) K4 i6 |4 u. {
0 |6 \  a0 D+ ?+ ]; V
                               
登录/注册后可看大图
    CreateXmlFile(fileName);) J. q5 X( `; Z2 Y6 P4 O
2 A6 b- b" r8 a7 s8 a" q. H& r  e# ?
                               
登录/注册后可看大图
    ReadXmlFile(fileName);# o8 P/ j, N8 D# i) J
- v: l4 `- q2 R, m2 X
                               
登录/注册后可看大图
}* j# H. I/ n" K
9 \8 [% w* C0 ^  ^! g6 V$ p
                               
登录/注册后可看大图
' f' W8 R. I. _2 O6 U- o3 k

1 s3 f: F4 ?# e
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  
0 {+ @$ C3 `2 [: l: e
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了