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 4345 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片段:
/ h2 X7 o) x2 a$ ?# H

% c. S2 R) F* ^/ ]7 b1 C                               
登录/注册后可看大图
   <Persons>1 p! G+ Y8 w" g/ q: B9 W
. P+ W- C: p% y2 W1 I( G. [2 o" S; G
                               
登录/注册后可看大图
        <Person ID="1">
4 O/ [# b5 W/ i3 b
. L+ c- Q/ U4 j5 a2 g' q$ t
                               
登录/注册后可看大图
            <name>周星星</name>7 D3 r$ ~! R2 J% L' c8 S5 i, A
" z1 @$ Q$ h1 ?* M; c
                               
登录/注册后可看大图
            <age>20</age>
( x  f9 S4 W6 N% f6 U

. W" ?) B2 D4 v& ?9 H                               
登录/注册后可看大图
        </Person>
* w; ~4 w9 O& q3 A5 L$ ?1 n

6 U+ M5 E  f$ a+ f                               
登录/注册后可看大图
        <Person ID="2">
$ z. p/ d2 K' f: ?+ S" Q4 B

4 D0 u. S; u6 h% X4 s. Z) J                               
登录/注册后可看大图
            <name>白晶晶</name>7 E* V/ j: b) @0 d

0 I& o6 Y! z' ?0 f( p* A( {                               
登录/注册后可看大图
            <age>18</age>
1 S1 h2 p2 ]6 s
; N2 e. K- N7 h2 i7 D# x4 _8 N0 o$ S
                               
登录/注册后可看大图
        </Person>
" @6 X9 s: P8 [

5 a1 r+ E5 f& _" I* m, m& v) _+ y$ B                               
登录/注册后可看大图
    </Persons>
4 ?$ I3 i% V. \7 c- F0 H' L# n6 _8 J
& m! r' Y, Z* c, k; x  N: R
                               
登录/注册后可看大图

9 S# R& W! m3 Q9 Y  g
在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文件:
. ]1 ]' z* [8 E* y9 r( N: Z- u+ k) m* R

+ _" X$ w" r& Q                               
登录/注册后可看大图
<Persons>
! f' d5 [- u/ _2 ^4 J$ J1 @

1 v4 Q* h+ F! X* S; M' o                               
登录/注册后可看大图
    <Person ID="1">1 {' _9 o  l5 h1 M5 L& a

. }5 c! z8 z6 q6 Z- C                               
登录/注册后可看大图
        <name>phinecos</name>. g) P) \* G( ?& ~1 ?
9 _4 d4 d4 g) J: G6 C1 E
                               
登录/注册后可看大图
        <age>22</age>
# V8 \. |& m# I( X
- U! P! r/ r7 H7 r0 n
                               
登录/注册后可看大图
    </Person>3 G3 `* C; P  f: I

9 m* q! L  R$ j8 u2 p/ M  J+ v                               
登录/注册后可看大图
</Persons>( p' n8 L) b) }+ R3 o
0 J- z; g2 y+ ]) _. \: [
                               
登录/注册后可看大图

8 ~. f+ x8 G: A1 o, H& t# z& x
读写XML文件的程序代码:7 G" b# z2 L( I% L$ e
  v) i3 ]- i5 h+ {1 _
                               
登录/注册后可看大图
#include <iostream>; m- r& ]$ `! |3 |9 J) L

8 t7 w1 k7 f. \* ~  o. A2 b* P                               
登录/注册后可看大图
#include "tinyxml.h"
" h8 {' Y' @, u1 G' \+ [" ?

0 ?% ]6 c% v( `' Y                               
登录/注册后可看大图
#include "tinystr.h"
; O( ^$ @+ m! j5 l1 W' g
: T. c- t" R% J- p/ K4 c
                               
登录/注册后可看大图
#include <string>
" K$ `* t1 N* I7 Y1 O! j) L
' E9 ~2 v* H; b7 d
                               
登录/注册后可看大图
#include <windows.h>( H; O6 t$ I$ A8 f9 `& R  m2 _
/ S/ ^# P) d# _+ j  v
                               
登录/注册后可看大图
#include <atlstr.h>9 q2 g) e3 _% {  g- Q
. O+ e. k  \* U9 W" t9 e/ U
                               
登录/注册后可看大图
using namespace std;
6 n) V: O  m% g! _0 g  e
; m& h' ~2 N3 @1 ?3 j
                               
登录/注册后可看大图
! @! Z3 w, _: |4 j. u9 N# W
! v2 c( L9 O( ]& ?4 B. `: ]
                               
登录/注册后可看大图
CString GetAppPath()9 l2 F4 Y( W5 G4 a6 v

" f' g6 m7 A0 y                               
登录/注册后可看大图
{//获取应用程序根目录
3 q0 f9 I# K5 G6 F. c1 a" W

8 w5 i# o. |3 _2 @3 s' o. P                               
登录/注册后可看大图
    TCHAR modulePath[MAX_PATH];" Z5 F& A6 i0 T( l" R, k. Z

6 I) v  c1 j8 o" f                               
登录/注册后可看大图
    GetModuleFileName(NULL, modulePath, MAX_PATH);
" \0 Q8 O. ?$ ^% N6 ]6 z
2 y3 O3 g' C, R# H5 K) W
                               
登录/注册后可看大图
    CString strModulePath(modulePath);7 ?) X: U3 ?) M+ n6 H2 Z: o
( z( x: R8 Y, x9 o4 g: ]
                               
登录/注册后可看大图
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
5 k1 k5 G# N0 X. w( L- R* J
: _. I# H: @& S  P" t
                               
登录/注册后可看大图
    return strModulePath;) Q  u+ e& [* s4 ~8 B- A! l0 q
: P5 v1 q% p: A, A
                               
登录/注册后可看大图
}
7 t! J" t3 u; {7 ]
1 J! A1 V2 M( y: f/ C. F
                               
登录/注册后可看大图
! e2 \" f7 W/ G; `
8 |- A: Z, P0 r7 z4 X4 ?/ W
                               
登录/注册后可看大图
bool CreateXmlFile(string& szFileName)& j4 @$ K+ c, o/ {7 h/ d
/ y$ c$ m5 q+ `$ A( F: K( ?
                               
登录/注册后可看大图
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false; m' y: H8 H1 M4 g5 B8 m& ^  J$ d

" t: ?3 k8 ~  n! J$ I. P: o                               
登录/注册后可看大图
    try
9 w9 M) i# Q7 K& @  Y

& b6 Q) G. T& B' V0 g+ K                               
登录/注册后可看大图
    {
0 q! |: n  W3 @5 t* C

+ \& S' A' a5 ]8 T8 L3 h                               
登录/注册后可看大图
        //创建一个XML的文档对象。
& B) u/ @. q! G

3 {2 a6 I/ p) d, v' y) D                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument();
/ N* t0 y3 r5 c; U) Z1 ~% w) S9 {0 A; a

1 H) e* g1 N0 g: Z' ]8 T& U0 T                               
登录/注册后可看大图
        //创建一个根元素并连接。1 H( }4 V' n/ Z2 O2 g4 i( H: A

- y- [# ^" q) v9 l. p9 X7 }4 {                               
登录/注册后可看大图
        TiXmlElement *RootElement = new TiXmlElement("Persons");7 T, c, f: }  v9 D* O4 ?

, [' ^2 J7 l  E3 W- e/ v                               
登录/注册后可看大图
        myDocument->LinkEndChild(RootElement);
" R0 H  ?. J3 `
  U- Z- Q* M6 J6 f& R% W' m8 ?7 x
                               
登录/注册后可看大图
        //创建一个Person元素并连接。7 b) `/ n4 Z" A* }$ d

9 o1 D" }4 N2 O' {& S                               
登录/注册后可看大图
        TiXmlElement *PersonElement = new TiXmlElement("Person");2 }" D0 r: [- B7 T

% C3 i7 ]1 m( c/ p1 J                               
登录/注册后可看大图
        RootElement->LinkEndChild(PersonElement);
! |6 L3 ~; _; a
! D2 {. V  z  \4 U8 D  ^$ j
                               
登录/注册后可看大图
        //设置Person元素的属性。8 w+ ^! R# S+ F1 q( p& J
, L" y7 s7 P9 ~$ G' O
                               
登录/注册后可看大图
        PersonElement->SetAttribute("ID", "1");# v) A9 F, e  K/ I  j" ~! `

0 e+ q4 b1 I* S' n- P# K$ G( v                               
登录/注册后可看大图
        //创建name元素、age元素并连接。
0 `0 ], `0 I( l/ L) c2 r7 H# |9 U
. @( R# T* e! [0 v
                               
登录/注册后可看大图
        TiXmlElement *NameElement = new TiXmlElement("name");3 |0 \2 [+ Z% T9 D
0 Y. a, j, K. G2 Y$ D
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = new TiXmlElement("age");0 f5 j; E/ G7 W' n: V% ^+ m* U

3 R. g# v$ o/ Q; n2 e                               
登录/注册后可看大图
        PersonElement->LinkEndChild(NameElement);) K' q7 \4 C$ U; H
5 d+ w7 g+ e* ^- w
                               
登录/注册后可看大图
        PersonElement->LinkEndChild(AgeElement);
9 a! D! v; H9 p; l8 F6 c4 [
3 H& V4 h+ x5 s8 b9 \
                               
登录/注册后可看大图
        //设置name元素和age元素的内容并连接。
: |, m0 e. H5 V; y6 |  a
8 X$ t0 \' |" U
                               
登录/注册后可看大图
        TiXmlText *NameContent = new TiXmlText("周星星");
# l8 [9 q/ o8 w# F. ]

' Y4 i, x5 D: `9 s0 ]: U                               
登录/注册后可看大图
        TiXmlText *AgeContent = new TiXmlText("22");
; o, W5 [+ W5 E, A+ j% M

. ]5 k3 F+ q9 e- l' m& P                               
登录/注册后可看大图
        NameElement->LinkEndChild(NameContent);
9 r8 r( x( x' P* S# z0 G* Q3 X5 n
3 |" M  w5 N- v8 V) D2 `
                               
登录/注册后可看大图
        AgeElement->LinkEndChild(AgeContent);
+ Q- u: i( U; N

6 @, H- W7 _" e3 X1 _/ a                               
登录/注册后可看大图
        CString appPath = GetAppPath();3 O3 D( w& f! H4 G+ b' r
& \$ D& M/ ^8 H
                               
登录/注册后可看大图
        string seperator = "\\";* w. f- u* L# C1 H$ J; x- ~
# p/ {* q% E: I) U9 D
                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
3 b; f1 d0 @+ [) n
+ c! y' G9 T' w: d7 s1 Y  q; E* h
                               
登录/注册后可看大图
        myDocument->SaveFile(fullPath.c_str());//保存到文件( ]  a0 T7 j/ a2 I  r) |

5 ?; C1 X/ C: ~. f( v                               
登录/注册后可看大图
    }8 [% J$ P5 {, s! o3 T- A. ?+ t" S

$ x' g* ]( X/ K* T% n( s; f                               
登录/注册后可看大图
    catch (string& e)
. m0 S) s0 |# h. f
" j# b* u, ]2 j' ?8 w$ t
                               
登录/注册后可看大图
    {
5 V" {# h6 M% W- Z

3 A0 @5 v3 @5 M1 y) e( W                               
登录/注册后可看大图
        return false;
) j& N! z7 C# T  w
9 `+ o& Y5 y6 Q1 P' j) R
                               
登录/注册后可看大图
    }
$ |) z* c# S0 X  j8 U% T
8 ]: M$ K2 b8 V* O' Q' ^9 f' L
                               
登录/注册后可看大图
    return true;
2 Z4 d' Q& M' ~, l" b% I! X

0 s! d# @- N+ _                               
登录/注册后可看大图
}
6 s# K1 O) X. F+ R9 X

5 s3 }! W6 \" y5 B  H- A9 P$ l                               
登录/注册后可看大图
1 s9 Z' g7 O5 h+ T

. r- F9 t. j9 z8 |1 T' @* O                               
登录/注册后可看大图
bool ReadXmlFile(string& szFileName)
0 X- j; M, p6 {
, ^& D9 t" b$ f1 B" [( n- J
                               
登录/注册后可看大图
{//读取Xml文件,并遍历& s* i1 A# q5 [1 i

  \. V+ @  V3 r5 c3 ?( G                               
登录/注册后可看大图
    try
( a- F3 [9 t. X. X
7 ?- |. s/ c  f2 a+ l
                               
登录/注册后可看大图
    {- g  o9 R5 `5 I( x

* D4 V/ h0 t. o, s- P" D0 u                               
登录/注册后可看大图
        CString appPath = GetAppPath();( O, E) o6 p1 H/ T2 B
! x  y! _5 x2 U' M* z3 P* D( ~
                               
登录/注册后可看大图
        string seperator = "\\";* G& i# t8 q' Z: F2 J

- B- I% q7 L. y                               
登录/注册后可看大图
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;" C; M2 k2 r) D% y
2 ]% A( @3 l  Q7 `, G% L+ U$ q
                               
登录/注册后可看大图
        //创建一个XML的文档对象。. \( v: |2 r# ?' I
+ t$ i5 E( ~$ _, R1 N( u  K
                               
登录/注册后可看大图
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());  c3 h' l, y. p9 }6 M- }( ~

8 a  Z9 d& a9 f- |, ^                               
登录/注册后可看大图
        myDocument->LoadFile();
6 U' g8 z0 u% @8 V* o, W- B( Q
/ c5 `4 B, Z/ O" \- L
                               
登录/注册后可看大图
        //获得根元素,即Persons。* g. [  v' Z) q  z
' r4 p+ K' _5 L4 y/ |
                               
登录/注册后可看大图
        TiXmlElement *RootElement = myDocument->RootElement();
2 m4 o8 F' i! B. X( z

# b" h8 q9 O6 U3 m" j                               
登录/注册后可看大图
        //输出根元素名称,即输出Persons。
# L9 ^- E7 L- l8 V# _( x; e
. c; W* g2 W8 x3 M
                               
登录/注册后可看大图
        cout << RootElement->Value() << endl;
, f5 x" `" R( I6 A. E+ M0 I! ~
/ v3 m# y0 \8 t. L- ^% h; m
                               
登录/注册后可看大图
        //获得第一个Person节点。
: U8 L' ?( m) d& h, ~

1 D( Q3 A# [6 {  c! I' G                               
登录/注册后可看大图
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
# n! v$ V) t/ L- ^
) p: ]( p% M/ B: \5 U, |3 t
                               
登录/注册后可看大图
        //获得第一个Person的name节点和age节点和ID属性。! T5 \5 G" W( u+ u7 r# S2 x) j  b

4 u, d3 c& J; {! b+ X                               
登录/注册后可看大图
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();& {* t5 D0 v9 d( ?
% Z3 L+ e6 E; C* N. G/ H, v8 C6 t
                               
登录/注册后可看大图
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();2 e" m* t  g/ N

# W) z- G# J2 }; j, u                               
登录/注册后可看大图
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();  s; J5 ]( I  ]# K$ n) }& j+ {# F, _
4 r- t9 F8 `& I, v* o! T0 F
                               
登录/注册后可看大图
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
; e4 Q' w5 x9 d0 w8 y
! w7 e6 y; ]( r* x0 N6 Y
                               
登录/注册后可看大图
        cout << NameElement->FirstChild()->Value() << endl;
7 h" b4 d( k+ I$ \

& n2 ]( _# }; C/ Z                               
登录/注册后可看大图
        cout << AgeElement->FirstChild()->Value() << endl;
) S. G1 q7 d% |
# G* C  W  ]7 L
                               
登录/注册后可看大图
        cout << IDAttribute->Value()<< endl;
6 q$ b  q' q7 u( y& G4 N
! c4 H% m, y) n) C& v
                               
登录/注册后可看大图
    }$ f: X4 A8 Y2 C

& Z6 Z  V6 M& {6 ?1 w- R# G" T                               
登录/注册后可看大图
    catch (string& e)7 C5 r( c6 U/ `# Y7 ?
  M9 H- `* ~4 `- M  Y0 P9 F
                               
登录/注册后可看大图
    {$ O! j  r( D9 D

5 ?8 B& ^' ^4 g; b4 S, Z$ Z! n                               
登录/注册后可看大图
        return false;$ T7 f; E; p4 q$ {+ W: g

% w9 D/ g; o( h  w  Z                               
登录/注册后可看大图
    }
1 L" E' x, ~9 d9 k
  ], N; _1 g( l1 e6 u5 `
                               
登录/注册后可看大图
    return true;  d# c- c$ i8 {- w4 b
% f8 W6 W  k0 G. g
                               
登录/注册后可看大图
}
# q7 l4 A& ?- A; z& A
6 s2 z' g) E4 s
                               
登录/注册后可看大图
int main(). ?6 s- F! o* H7 e! C* i& _: ]! e8 c

4 E, c4 D8 C/ P1 U% `/ U                               
登录/注册后可看大图
{$ Q& g) f. L" w
& w8 e; ~9 y5 b5 I( q  {, F& n
                               
登录/注册后可看大图
    string fileName = "info.xml";0 F; }. K3 C1 T
; s  L: X  a3 |3 x' p9 F! \$ F
                               
登录/注册后可看大图
    CreateXmlFile(fileName);
. G' U0 u8 m# d7 d

2 y; j5 T$ `( ^/ M                               
登录/注册后可看大图
    ReadXmlFile(fileName);
8 L! z0 H( i; `7 P4 ~# @

7 F; @4 P9 G# g4 r) [& Y& H                               
登录/注册后可看大图
}
2 M, p# O! w5 z9 B, N+ K
. R* O% J3 C# [$ L
                               
登录/注册后可看大图
" ]/ ~" T1 u9 S- z) ^* t

- M( m2 i: n7 ^
该会员没有填写今日想说内容.
回复

使用道具 举报

全部回复1

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

magic浪漫 沙发

2015-1-29 19:28:56

学习了 请问是从那本电子书转载的  # a3 Y" _7 n8 Z' ^/ P7 H* B7 u4 V
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了