TinyXml面向对象的接口化.docx
- 文档编号:24238484
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:21
- 大小:20.47KB
TinyXml面向对象的接口化.docx
《TinyXml面向对象的接口化.docx》由会员分享,可在线阅读,更多相关《TinyXml面向对象的接口化.docx(21页珍藏版)》请在冰豆网上搜索。
TinyXml面向对象的接口化
将TinyXml快速入门的接口面向对象化
分类:
HTML/XML2010-03-2815:
11 1037人阅读 评论(6) 收藏 举报
作者:
朱金灿
来源:
在TinyXml快速入门的系列文章中(详情见本博客),我只是将tinyxml类库解析xml文件的类封装为API接口。
这次我决定将这些API接口对象化,并结合自定义的数据结构解析xml文件。
具体是新建一个CXmlParse类,头文件声明如下:
viewplain
1.#include
2.#include
3.#include
4.#include "../tinyxml/tinyxml.h"
5.#include "BaseStruct.h"
6.using std:
:
string;
7.using std:
:
vector;
8.using std:
:
map;
9./*!
/struct MyAppInfo XmlParse.h
10.* /brief 程序信息结构体.
11.*
12.* 包含了程序名、公司名和公司网址
13.*/
14.struct MyAppInfo
15.{
16. MyAppInfo()
17. {
18. m_strAppName = _T("");
19. m_strCompanyName = _T("") ;
20. m_strUrl = _T("") ;
21. }
22. string m_strAppName;
23. string m_strCompanyName;
24. string m_strUrl;
25.};
26./*!
/class CXmlParse XmlParse.h
27.* /brief xml文件解析类
28.*
29.* 实现对xml文件的查询、修改和删除节点操作
30.* /author 朱金灿.
31.* /version 0.1
32.* /date 2010.03.28.
33.*/
34.class CXmlParse
35.{
36.public:
37. CXmlParse(void);
38. ~CXmlParse(void);
39.public:
40. /*!
41. * /brief 打开xml文件。
42. *
43. * /param [in]XmlFile xml文件全路径。
44. * /return 是否成功。
true为成功,false表示失败。
45. */
46. bool OpenXml(const string& XmlFile);
47. /*!
48. * /brief 在控制台上打印xml文件。
49. *
50. * /return 无。
51. */
52. void PaintXml();
53. /*!
54. * /brief 获取xml文件的声明。
55. *
56. * /param strVersion [in][out]Version属性值
57. * /param strStandalone [in][out]Standalone属性值
58. * /param strEncoding [in][out]Encoding属性值
59. * /return 是否成功。
true为成功,false表示失败。
60. */
61. bool GetXmlDeclare(string &strVersion,string &strStandalone,string &strEncoding);
62. /*!
63. * /brief 通过节点查询。
64. *
65. * /param strNodeName [in]要查询的节点名
66. * /param strText [in][out]查询的结果节点文本
67. * /return 是否找到。
true为成功找到,false表示没有找到。
68. */
69. bool QueryNode_Text(const string& strNodeName,string &strText);
70. /*!
71. * /brief 通过节点查询。
72. *
73. * /param strNodeName [in]要查询的节点名
74. * /param AttMap [in][out]查询的结果属性值,这是一个map,前一个为属性名,后一个为属性值
75. * /return 是否成功。
true为成功,false表示失败。
76. */
77. bool QueryNode_Attribute(const string& strNodeName,map
78. /*!
79. * /brief 删除指定节点的值。
80. *
81. * /param strNodeName [in]指定的节点名。
82. * /return 是否成功。
true为成功,false表示失败。
83. */
84. bool DelNode(const string& strNodeName);
85. /*!
86. * /brief 修改指定节点的文本。
87. *
88. * /param strNodeName [in]指定的节点名。
89. * /param strText [in]重新设定的文本的值
90. * /return 是否成功。
true为成功,false表示失败。
91. */
92. bool ModifyNode_Text(const string& strNodeName,const string& strText);
93. /*!
94. * /brief 修改指定节点的属性。
95. *
96. * /param [in]strNodeName 指定的节点名。
97. * /param [in]AttMap 重新设定的属性值,这是一个map,前一个为属性名,后一个为属性值
98. * /return 是否成功。
true为成功,false表示失败。
99. */
100. bool ModifyNode_Attribute(const string& strNodeName,
101. const map
102. /*!
103. * /brief 修改指定节点的属性。
104. *
105. * /param [in]strNodeName 指定的节点名。
106. * /param [in]strAttValue 指定的节点的其中一个属性值。
107. * /param [in]AttMap 重新设定的属性值,这是一个map,前一个为属性名,后一个为属性值
108. * /return 是否成功。
true为成功,false表示失败。
109. */
110. bool ModifyNode_Attribute2(string strNodeName,string strAttValue,
111. const map
112.public:
113. /*!
114. * /brief 获取应用程序信息。
115. *
116. * /param [in][out]Info 指定的节点名。
117. * /return 是否成功。
true为成功,false表示失败。
118. */
119. bool GetAppInfo(MyAppInfo& Info);
120.private:
121. /*!
122. * /brief 通过根节点和节点名获取节点指针。
123. *
124. * /param pRootEle [in]xml文件的待检查的节点。
125. * /param strNodeName [in]要查询的节点名。
126. * /param Node [in][out]需要查询的节点指针。
127. * /return 是否找到。
true为找到相应节点指针,false表示没有找到相应节点指针。
128. */
129. bool GetNodePointerByName(TiXmlElement* pRootEle,const string &strNodeName,TiXmlElement* &Node);
130. /*!
131. * /brief 通过根节点和节点名以及节点的一个属性值获取节点指针。
132. *
133. * /param pRootEle [in]xml文件的待检查的节点。
134. * /param strNodeName [in]要查询的节点名
135. * /param strNodeName [in]要查询的节点的一个属性值
136. * /param Node [in][out]需要查询的节点指针
137. * /return 是否找到。
true为找到相应节点指针,false表示没有找到相应节点指针。
138. */
139. bool GetNodePointerByName_Attribute(TiXmlElement* pRootEle,
140. const string &strNodeName,
141. const string &strAttributeValue,
142. TiXmlElement* &Node);
143.protected:
144. /**
145. * /brief 实际操作xml文件的类。
146. */
147. TiXmlDocument *m_pDoc;
148. /**
149. * /brief xml文件全路径。
150. */
151. string m_strXmlFile;
152.};
实现文件的代码如下:
viewplain
1.#include
2.#include "XmlParse.h"
3.CXmlParse:
:
CXmlParse(void)
4.{
5. m_pDoc = NULL;
6. m_strXmlFile = _T("");
7.}
8.CXmlParse:
:
~CXmlParse(void)
9.{
10. delete m_pDoc;
11.}
12.bool CXmlParse:
:
OpenXml(const string& XmlFile)
13.{
14. if (NULL!
=m_pDoc)
15. {
16. delete m_pDoc;
17. m_pDoc = NULL;
18. }
19. m_pDoc = new TiXmlDocument();
20. if (NULL==m_pDoc)
21. {
22. return false;
23. }
24. m_pDoc->LoadFile(XmlFile);
25. m_strXmlFile = XmlFile;
26. return true;
27.}
28.void CXmlParse:
:
PaintXml()
29.{
30. assert(NULL!
=m_pDoc);
31. m_pDoc->Print();
32.}
33.bool CXmlParse:
:
GetXmlDeclare(string &strVersion,string &strStandalone,string &strEncoding)
34.{
35. assert(NULL!
=m_pDoc);
36. // 找到第一个节点
37. TiXmlNode* pXmlFirst = m_pDoc->FirstChild();
38. if (NULL !
= pXmlFirst)
39. {
40. TiXmlDeclaration* pXmlDec = pXmlFirst->ToDeclaration();
41. if (NULL !
= pXmlDec)
42. {
43. // 获取各种信息
44. strVersion = pXmlDec->Version();
45. strStandalone = pXmlDec->Standalone();
46. strEncoding = pXmlDec->Encoding();
47. }
48. }
49. return true;
50.}
51.bool CXmlParse:
:
GetNodePointerByName(TiXmlElement* pRootEle,const string &strNodeName,TiXmlElement* &Node)
52.{
53. assert(NULL!
=pRootEle);
54. if (strNodeName==pRootEle->Value())
55. {
56. Node = pRootEle;
57. return true;
58. }
59. TiXmlElement* pEle = pRootEle;
60. for (pEle = pRootEle->FirstChildElement();pEle;pEle = pEle->NextSiblingElement())
61. {
62. //递归处理子节点
63. if(GetNodePointerByName(pEle,strNodeName,Node))
64. return true;
65. }
66. return false;
67.}
68.bool CXmlParse:
:
GetNodePointerByName_Attribute(TiXmlElement* pRootEle,
69. const string &strNodeName,
70. const string &strAttributeValue,
71. TiXmlElement* &Node)
72.{
73. assert(NULL!
=pRootEle);
74. // 假如等于根节点名,就退出
75. if (strNodeName==pRootEle->Value())
76. {
77. TiXmlAttribute* pAttr = NULL;
78. for (pAttr = pRootEle->FirstAttribute(); pAttr; pAttr = pAttr->Next())
79. {
80. std:
:
string strAttValue = pAttr->Value();
81. if (strAttributeValue==strAttValue)
82. {
83. Node = pRootEle;
84. }
85. }
86. }
87. TiXmlElement* pEle = pRootEle;
88. for (pEle = pRootEle->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())
89. {
90. //递归处理子节点
91. if(GetNodePointerByName_Attribute(pEle,strNodeName,strAttributeValue,Node))
92. return true;
93. }
94. return false;
95.}
96. bool CXmlParse:
:
QueryNode_Text(const string& strNodeName,string &strText)
97. {
98. assert(NULL!
=m_pDoc);
99. TiXmlElement *pRootEle = m_pDoc->RootElement();
100. if (NULL==pRootEle)
101. {
102. return false;
103. }
104. TiXmlElement *pNode = NULL;
105. GetNodePointerByName(pRootEle,strNodeName,pNode);
106. if (NULL!
=pNode)
107. {
108. const char* psz = pNode->GetText();
109. if (NULL==psz)
110. {
111. strText = _T("");
112. }
113. else
114. {
115. strText = psz;
116. }
117. return true;
118. }
119. else
120. {
121. return false;
122. }
123. }
124. bool CXmlParse:
:
QueryNode_Attribute(const string& strNodeName,map
125. {
126. assert(NULL!
=m_pDoc);
127. typedef std:
:
pair : string,std: : string> String_Pair; 128. TiXmlElement *pRootEle = m_pDoc->RootElement(); 129. if (NULL==pRootEle) 130. { 131. return false; 132. } 133. TiXmlElement *pNode = NULL; 134. GetNodePointerByName(pRootEle,strNodeName,pNode); 135. if (NULL! =pNode) 136. { 137. TiXmlAttribute* pAttr = NULL; 138. for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next()) 139. { 140. std: : string strAttName = pAttr->Name(); 141. std: : string st
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TinyXml 面向 对象 接口