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
 11namespace 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
 22typedef MSXML2::IXMLDOMElementPtr XmlNode;
 23
 24inline 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
 36inline 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
 46inline 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
 56inline 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
 66inline 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
 82class CXml
 83{
 84public:
 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
105public:
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
360protected:
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 阅读(397) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜