Zero Code
零度代码
XmlHelper 一个简单的 MSXml 包装类
下载 :
http://www.cppblog.com/Files/cntrump/XmlHelper.rar
1
//
module:XmlHelper.h
2
//
author:cntrump
3
//
create:2011-05-02
4
5
#ifndef _XMLHELPER_H
6
#define
_XMLHELPER_H
7
8
#pragma once
9
#import
<
msxml4.dll
>
10
11
namespace
XmlHelper
12
{
13
#define
RELEASE_PTR(x) do{if ((x)!=NULL) (x).Release(); (x)=NULL;}while(0)
14
#define
RELEASE(x) do{if ((x)!=NULL) (x)->Release(); (x)=NULL;}while(0)
15
16
#if
defined(DEBUG)||defined(_DEBUG)
17
#define
XMLTRACE DebugInfo
18
#else
19
#define
XMLTRACE
20
#endif
//
DEBUG
21
22
typedef MSXML2::IXMLDOMElementPtr XmlNode;
23
24
inline
void
DebugInfo(LPWSTR fmt,
)
25
{
26
WCHAR wzOutput[
512
];
27
ZeroMemory(wzOutput,
sizeof
(wzOutput));
28
va_list arg;
29
va_start(arg, fmt);
30
_vswprintf_p(wzOutput, _countof(wzOutput), fmt, arg);
31
va_end(arg);
32
33
OutputDebugStringW(wzOutput);
34
}
35
36
inline BOOL W2A(LPSTR szAnsi, DWORD cchAnsiLen, LPCWSTR wzWide)
37
{
38
INT nLen
=
WideCharToMultiByte(CP_ACP,
0
, wzWide,
-
1
, NULL,
0
, NULL, NULL);
39
40
if
(nLen
>
cchAnsiLen)
41
return
FALSE;
42
43
return
0
!=
WideCharToMultiByte(CP_ACP,
0
, wzWide,
-
1
, szAnsi, cchAnsiLen, NULL, NULL);
44
}
45
46
inline BOOL A2W(LPWSTR wzWide, DWORD cchWideLen, LPCSTR szAnsi)
47
{
48
INT nLen
=
MultiByteToWideChar(CP_ACP,
0
, szAnsi,
-
1
, NULL,
0
);
49
50
if
(nLen
>
cchWideLen)
51
return
FALSE;
52
53
return
0
!=
MultiByteToWideChar(CP_ACP,
0
, szAnsi,
-
1
, wzWide, cchWideLen);
54
}
55
56
inline BOOL Utf2W(LPWSTR wzWide, DWORD cchWideLen, LPCSTR Utf8)
57
{
58
INT nLen
=
MultiByteToWideChar(CP_UTF8,
0
, Utf8,
-
1
, NULL,
0
);
59
60
if
(nLen
>
cchWideLen)
61
return
FALSE;
62
63
return
0
!=
MultiByteToWideChar(CP_UTF8,
0
, Utf8,
-
1
, wzWide, cchWideLen);
64
}
65
66
inline BOOL Utf2A(LPSTR szAnsi, DWORD cchAnsiLen, LPCSTR Utf8)
67
{
68
INT nLen
=
MultiByteToWideChar(CP_UTF8,
0
, Utf8,
-
1
, NULL,
0
);
69
LPWSTR pwBuffer
=
new
WCHAR[nLen
+
1
];
70
ZeroMemory(pwBuffer,
sizeof
(WCHAR)
*
(nLen
+
1
));
71
72
if
(nLen
>
cchWideLen)
73
return
FALSE;
74
75
MultiByteToWideChar(CP_UTF8,
0
, Utf8,
-
1
, pwBuffer, nLen
+
1
);
76
INT nError
=
WideCharToMultiByte(CP_ACP,
0
, pwBuffer,
-
1
, szAnsi, cchAnsiLen, NULL, NULL);
77
delete pwBuffer;
78
79
return
0
!=
nError;
80
}
81
82
class
CXml
83
{
84
public
:
85
CXml ()
86
:m_pxmlDoc(NULL)
87
,m_bInit(FALSE)
88
,m_pxmlRootElement(NULL)
89
,m_bsFile(NULL)
90
{
91
HRESULT hr
=
m_pxmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
92
93
if
(SUCCEEDED(hr))
94
m_bInit
=
TRUE;
95
}
96
97
~
CXml()
98
{
99
if
(NULL
!=
m_bsFile)
100
{
101
SysFreeString(m_bsFile);
102
}
103
}
104
105
public
:
106
BOOL Load(LPCWSTR pszFile)
107
{
108
if
(
!
m_bInit)
109
return
FALSE;
110
111
m_bsFile
=
SysAllocString(pszFile);
112
113
if
(VARIANT_TRUE
==
m_pxmlDoc
->
load(BSTR(pszFile)))
114
{
115
m_pxmlRootElement
=
m_pxmlDoc
->
GetdocumentElement();
116
XMLTRACE(L
"
file %s exist
"
, pszFile);
117
}
118
else
119
{
120
MSXML2::IXMLDOMProcessingInstructionPtr xmlIns;
121
xmlIns
=
m_pxmlDoc
->
createProcessingInstruction(BSTR(L
"
xml
"
), BSTR(L
"
version='1.0' encoding='utf-8'
"
));
122
m_pxmlDoc
->
appendChild(xmlIns);
123
XMLTRACE(L
"
file %s isn't exist
"
, pszFile);
124
}
125
126
return
TRUE;
127
128
}
//
end Load
129
130
BOOL LoadXml(LPCWSTR pszXml)
131
{
132
if
(
!
m_bInit)
133
return
FALSE;
134
135
if
(VARIANT_FALSE
==
m_pxmlDoc
->
loadXML(pszXml))
136
return
FALSE;
137
138
m_pxmlRootElement
=
m_pxmlDoc
->
GetdocumentElement();
139
140
return
TRUE;
141
}
142
143
BOOL Save(LPCWSTR pszFile
=
NULL)
144
{
145
if
(
!
m_bInit)
146
return
FALSE;
147
148
if
(NULL
==
m_pxmlRootElement)
149
return
FALSE;
150
151
BSTR bsFile
=
m_bsFile;
152
153
if
(NULL
!=
pszFile)
154
bsFile
=
BSTR(pszFile);
155
156
HRESULT hr
=
m_pxmlDoc
->
save(bsFile);
157
158
if
(SUCCEEDED(hr))
159
return
TRUE;
160
161
return
FALSE;
162
}
163
164
XmlNode AddRoot(LPCWSTR pszNodeName)
165
{
166
if
(
!
m_bInit)
167
return
NULL;
168
169
if
(NULL
!=
m_pxmlRootElement)
170
return
NULL;
171
172
m_pxmlRootElement
=
m_pxmlDoc
->
createElement(pszNodeName);
173
174
if
(NULL
==
m_pxmlRootElement)
175
return
NULL;
176
177
return
m_pxmlDoc
->
appendChild(m_pxmlRootElement);
178
}
//
end AddRoot
179
180
XmlNode GetRoot()
181
{
182
if
(
!
m_bInit)
183
return
NULL;
184
185
if
(NULL
==
m_pxmlRootElement)
186
return
NULL;
187
188
return
m_pxmlRootElement;
189
}
//
end GetRoot
190
191
XmlNode AddNode(
const
XmlNode node, LPCWSTR pszNodeName)
192
{
193
if
(
!
m_bInit)
194
return
NULL;
195
196
if
(NULL
==
m_pxmlRootElement)
197
return
NULL;
198
199
XmlNode newNode
=
m_pxmlDoc
->
createElement(pszNodeName);
200
201
if
(NULL
==
newNode)
202
return
NULL;
203
204
return
node
->
appendChild(newNode);
205
}
//
end AddNode
206
207
BOOL SetNodeText(
const
XmlNode node, LPCWSTR pszNodeText)
208
{
209
if
(
!
m_bInit)
210
return
FALSE;
211
212
if
(NULL
==
m_pxmlRootElement)
213
return
FALSE;
214
215
node
->
Puttext(pszNodeText);
216
217
return
TRUE;
218
}
//
end AddNodeText
219
220
BOOL RemoveNode(
const
XmlNode node)
221
{
222
if
(
!
m_bInit)
223
return
FALSE;
224
225
if
(NULL
==
m_pxmlRootElement)
226
return
FALSE;
227
228
XmlNode parentNode;
229
parentNode
=
node
->
GetparentNode();
230
231
if
(NULL
!=
parentNode)
232
parentNode
->
removeChild(node);
233
else
234
{
235
m_pxmlRootElement
=
m_pxmlDoc
->
removeChild(node);
236
}
237
238
return
TRUE;
239
}
//
end RemoveNode
240
241
BOOL RemoveAttribute(
const
XmlNode node, LPCWSTR pszAttributeName)
242
{
243
if
(
!
m_bInit)
244
return
FALSE;
245
246
if
(NULL
==
m_pxmlRootElement)
247
return
FALSE;
248
249
HRESULT hr
=
node
->
removeAttribute(pszAttributeName);
250
251
if
(SUCCEEDED(hr))
252
return
TRUE;
253
254
return
FALSE;
255
}
256
257
BOOL SetAttribute(
const
XmlNode node, LPCWSTR pszAttributeName, LPCWSTR pszValue)
258
{
259
if
(
!
m_bInit)
260
return
FALSE;
261
262
if
(NULL
==
m_pxmlRootElement)
263
return
FALSE;
264
265
HRESULT hr
=
node
->
setAttribute(pszAttributeName, pszValue);
266
267
if
(SUCCEEDED(hr))
268
return
TRUE;
269
270
return
FALSE;
271
}
//
end SetAttribute
272
273
BOOL GetAttributeValue(
const
XmlNode node, LPCWSTR pszAttributeName, LPWSTR pszValue, DWORD cchValueLen)
274
{
275
if
(
!
m_bInit)
276
return
FALSE;
277
278
if
(NULL
==
m_pxmlRootElement)
279
return
FALSE;
280
281
VARIANT var
=
node
->
getAttribute(pszAttributeName);
282
283
if
(var.vt
==
VT_NULL)
284
return
FALSE;
285
286
wcsncpy_s(pszValue, cchValueLen, (LPCWSTR)var.bstrVal, SysStringLen(var.bstrVal));
287
288
return
TRUE;
289
}
//
end GetAttribute
290
291
BOOL GetNodeName(
const
XmlNode node, LPWSTR pszNodeName, DWORD cchNodeNameLen)
292
{
293
if
(
!
m_bInit)
294
return
FALSE;
295
296
if
(NULL
==
m_pxmlRootElement)
297
return
FALSE;
298
299
_bstr_t bsNodeName
=
node
->
GetnodeName();
300
301
if
(bsNodeName.length()
==
0
)
302
return
FALSE;
303
304
wcsncpy_s(pszNodeName, cchNodeNameLen, (LPCWSTR)bsNodeName, bsNodeName.length());
305
306
return
TRUE;
307
}
//
end GetNode
308
309
XmlNode SelectNode(LPCWSTR pszNodePathOrName)
const
310
{
311
if
(
!
m_bInit)
312
return
FALSE;
313
314
if
(NULL
==
m_pxmlRootElement)
315
return
FALSE;
316
317
return
m_pxmlDoc
->
selectSingleNode(pszNodePathOrName);
318
319
}
//
end SelectNode
320
321
XmlNode NextNode(
const
XmlNode node)
const
322
{
323
if
(
!
m_bInit)
324
return
FALSE;
325
326
if
(NULL
==
m_pxmlRootElement)
327
return
FALSE;
328
329
return
node
->
GetnextSibling();
330
}
//
end NextNode
331
332
XmlNode PrevNode(
const
XmlNode node)
const
333
{
334
if
(
!
m_bInit)
335
return
FALSE;
336
337
if
(NULL
==
m_pxmlRootElement)
338
return
FALSE;
339
340
return
node
->
GetpreviousSibling();
341
}
//
end PrevNode
342
343
BOOL HasSubNode(XmlNode node)
344
{
345
if
(
!
m_bInit)
346
return
FALSE;
347
348
if
(NULL
==
m_pxmlRootElement)
349
return
FALSE;
350
351
return
node
->
hasChildNodes()
==
VARIANT_TRUE;
352
}
//
end HasSubNode
353
354
VOID Release()
355
{
356
RELEASE_PTR(m_pxmlRootElement);
357
RELEASE_PTR(m_pxmlDoc);
358
}
//
end Release
359
360
protected
:
361
MSXML2::IXMLDOMDocument2Ptr m_pxmlDoc;
362
BOOL m_bInit;
363
MSXML2::IXMLDOMElementPtr m_pxmlRootElement;
364
BSTR m_bsFile;
365
}
;
366
367
}
368
369
#endif
//
_XMLHELPER_H
posted on 2011-05-03 00:31
cntrump
阅读(581)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
My Links
C++博客
首页
新随笔
联系
聚合
管理
Blog Stats
随笔 - 7
文章 - 0
评论 - 0
Trackbacks - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2011年5月 (4)
2011年4月 (3)
搜索
最新评论
阅读排行榜
1. 调用系统的文件复制,移动和删除功能(1099)
2. 使用 Gdiplus 将图片设置为窗口背景(920)
3. Ring3 Api Hook (2) Hot patching inline hook(596)
4. XmlHelper 一个简单的 MSXml 包装类(581)
5. Ring3 Api Hook (1) 古老的 inline Hook(476)
评论排行榜
1. 调用系统的文件复制,移动和删除功能(0)
2. 使用系统的 SDK 创建多级目录(0)
3. 在桌面上显示画图(0)
4. XmlHelper 一个简单的 MSXml 包装类(0)
5. 使用 Gdiplus 将图片设置为窗口背景(0)
Powered by:
C++博客
Copyright © cntrump