XMLDOMElement.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:9k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Id: XMLDOMElement.cpp,v 1.7 2001/05/11 13:25:04 tng Exp $
  58.  */
  59. #include "stdafx.h"
  60. #include "xml4com.h"
  61. #include "XMLDOMElement.h"
  62. #include "XMLDOMAttribute.h"
  63. #include "XMLDOMNodeList.h"
  64. // IXMLDOMElement methods
  65. STDMETHODIMP CXMLDOMElement::get_tagName(BSTR  *pVal)
  66. {
  67. ATLTRACE(_T("CXMLDOMElement::get_tagNamen"));
  68. if (NULL == pVal)
  69. return E_POINTER;
  70. *pVal = NULL;
  71. try
  72. {
  73. DOMString val = element.getTagName();
  74. *pVal = SysAllocStringLen(val.rawBuffer(),val.length());
  75. }
  76. catch(DOM_DOMException& ex)
  77. {
  78. return MakeHRESULT(ex);
  79. }
  80. catch(...)
  81. {
  82. return E_FAIL;
  83. }
  84. return S_OK;
  85. }
  86. STDMETHODIMP CXMLDOMElement::getAttribute(BSTR name, VARIANT  *pVal)
  87. {
  88. ATLTRACE(_T("CXMLDOMElement::getAttributen"));
  89. if (NULL == pVal)
  90. return E_POINTER;
  91. ::VariantInit(pVal);
  92. V_VT(pVal) = VT_EMPTY;
  93. DOMString a = element.getAttribute(name);
  94. try {
  95. V_VT(pVal)   = VT_BSTR;
  96. V_BSTR(pVal) = SysAllocStringLen(a.rawBuffer(),a.length());
  97. }
  98. catch(DOM_DOMException& ex)
  99. {
  100. return MakeHRESULT(ex);
  101. }
  102. catch(...) {
  103. return E_FAIL;
  104. }
  105. return S_OK;
  106. }
  107. STDMETHODIMP CXMLDOMElement::setAttribute(BSTR name, VARIANT value)
  108. {
  109. ATLTRACE(_T("CXMLDOMElement::setAttributen"));
  110. try
  111. {
  112. if (V_VT(&value) == VT_BSTR)
  113. {
  114. element.setAttribute(name, value.bstrVal);
  115. }
  116. else {
  117. element.setAttribute(name,(BSTR) (_bstr_t) value);
  118. }
  119. }
  120. catch(DOM_DOMException& ex)
  121. {
  122. return MakeHRESULT(ex);
  123. }
  124. catch(...)
  125. {
  126. return E_FAIL;
  127. }
  128. return S_OK;
  129. }
  130. STDMETHODIMP CXMLDOMElement::removeAttribute(BSTR name)
  131. {
  132. ATLTRACE(_T("CXMLDOMElement::removeAttributen"));
  133. try
  134. {
  135. element.removeAttribute(name);
  136. }
  137. catch(DOM_DOMException& ex)
  138. {
  139. return MakeHRESULT(ex);
  140. }
  141. catch(...)
  142. {
  143. return E_FAIL;
  144. }
  145. return S_OK;
  146. }
  147. STDMETHODIMP CXMLDOMElement::getAttributeNode(BSTR name, IXMLDOMAttribute  **attr)
  148. {
  149. ATLTRACE(_T("CXMLDOMElement::getAttributeNoden"));
  150. if (NULL == attr)
  151. return E_POINTER;
  152. *attr = NULL;
  153. DOM_Attr attrNode(element.getAttributeNode(name));
  154. if(attrNode.isNull())
  155. return S_OK;
  156. CXMLDOMAttributeObj *pObj = NULL;
  157. HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj);
  158. if (S_OK != hr)
  159. return hr;
  160. pObj->AddRef();
  161. pObj->SetOwnerDoc(m_pIXMLDOMDocument);
  162. try
  163. {
  164. pObj->attr = attrNode;
  165. }
  166. catch(DOM_DOMException& ex)
  167. {
  168. pObj->Release();
  169. return MakeHRESULT(ex);
  170. }
  171. catch(...)
  172. {
  173. pObj->Release();
  174. return E_FAIL;
  175. }
  176. hr = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast<LPVOID*> (attr));
  177. if (S_OK != hr)
  178. *attr = NULL;
  179. pObj->Release();
  180. return hr;
  181. }
  182. STDMETHODIMP CXMLDOMElement::setAttributeNode(IXMLDOMAttribute  *attr, IXMLDOMAttribute  **attributeNode)
  183. {
  184. ATLTRACE(_T("CXMLDOMElement::setAttributeNoden"));
  185. if (NULL == attr || NULL == attributeNode)
  186. return E_POINTER;
  187. *attributeNode = NULL;
  188. DOM_Attr* newAttr = NULL;
  189. IIBMXMLDOMNodeIdentity* nodeID = NULL;
  190. HRESULT sc = attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID);
  191. if(SUCCEEDED(sc)) {
  192. long id = 0;
  193. sc = nodeID->get_NodeId(&id);
  194. nodeID->Release();
  195. if(SUCCEEDED(sc)) {
  196. //
  197. //   any subsequent failure will be reported as an invalid arg
  198. //
  199. sc = E_INVALIDARG;
  200. try {
  201. DOM_Node* newNode = (DOM_Node*) id;
  202. if(newNode->getNodeType() == DOM_Node::ATTRIBUTE_NODE) {
  203. newAttr = (DOM_Attr*) newNode;
  204. }
  205. }
  206. catch(...) {
  207. }
  208. }
  209. }
  210. //
  211. //   if we couldn't extract an attribute out of the
  212. //       argument, then return with a failure code
  213. if(newAttr == NULL) return sc;
  214. sc = S_OK;
  215. try
  216. {
  217. DOM_Attr& oldAttr = element.setAttributeNode(*newAttr);
  218. if(!oldAttr.isNull()) {
  219. CXMLDOMAttributeObj *pObj = NULL;
  220. sc = CXMLDOMAttributeObj::CreateInstance(&pObj);
  221. if (SUCCEEDED(sc)) {
  222. pObj->attr = oldAttr;
  223. pObj->AddRef();
  224. pObj->SetOwnerDoc(m_pIXMLDOMDocument);
  225. sc = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast<LPVOID*> (attributeNode));
  226. pObj->Release();
  227. }
  228. }
  229. }
  230. catch(DOM_DOMException& ex)
  231. {
  232. return MakeHRESULT(ex);
  233. }
  234. catch(...)
  235. {
  236. return E_FAIL;
  237. }
  238. return sc;
  239. }
  240. STDMETHODIMP CXMLDOMElement::removeAttributeNode(IXMLDOMAttribute  *attr, IXMLDOMAttribute  * *attributeNode)
  241. {
  242. ATLTRACE(_T("CXMLDOMElement::removeAttributeNoden"));
  243. if (NULL == attr || NULL == attributeNode)
  244. return E_POINTER;
  245. *attributeNode = NULL;
  246. CXMLDOMAttributeObj *pObj = NULL;
  247. HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj);
  248. if (S_OK != hr)
  249. return hr;
  250. pObj->AddRef();
  251. pObj->SetOwnerDoc(m_pIXMLDOMDocument);
  252. try
  253. {
  254. long id = 0;
  255. IIBMXMLDOMNodeIdentity* nodeID = NULL;
  256. if(SUCCEEDED(attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID))) {
  257. nodeID->get_NodeId(&id);
  258. nodeID->Release();
  259. }
  260. pObj->attr = element.removeAttributeNode(*((DOM_Attr*) id));
  261. }
  262. catch(DOM_DOMException& ex)
  263. {
  264. pObj->Release();
  265. return MakeHRESULT(ex);
  266. }
  267. catch(...)
  268. {
  269. pObj->Release();
  270. return E_FAIL;
  271. }
  272. hr = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast<LPVOID*> (attributeNode));
  273. if (S_OK != hr)
  274. *attributeNode = NULL;
  275. pObj->Release();
  276. return hr;
  277. }
  278. STDMETHODIMP CXMLDOMElement::getElementsByTagName(BSTR tagName, IXMLDOMNodeList  **pVal)
  279. {
  280. ATLTRACE(_T("CXMLDOMElement::getElementsByTagNamen"));
  281. if (NULL == pVal)
  282. return E_POINTER;
  283. *pVal = NULL;
  284. CXMLDOMNodeListObj *pObj = NULL;
  285. HRESULT hr = CXMLDOMNodeListObj::CreateInstance(&pObj);
  286. if (S_OK != hr)
  287. return hr;
  288. pObj->AddRef();
  289. pObj->SetOwnerDoc(m_pIXMLDOMDocument);
  290. try
  291. {
  292. pObj->m_container = element.getElementsByTagName(tagName);
  293. }
  294. catch(DOM_DOMException& ex)
  295. {
  296. pObj->Release();
  297. return MakeHRESULT(ex);
  298. }
  299. catch(...)
  300. {
  301. pObj->Release();
  302. return E_FAIL;
  303. }
  304. hr = pObj->QueryInterface(IID_IXMLDOMNodeList, reinterpret_cast<LPVOID*> (pVal));
  305. if (S_OK != hr)
  306. *pVal = NULL;
  307. pObj->Release();
  308. return hr;
  309. }
  310. STDMETHODIMP CXMLDOMElement::normalize(void)
  311. {
  312. ATLTRACE(_T("CXMLDOMElement::normalizen"));
  313. try
  314. {
  315. element.normalize();
  316. }
  317. catch(DOM_DOMException& ex)
  318. {
  319. return MakeHRESULT(ex);
  320. }
  321. catch(...)
  322. {
  323. return E_FAIL;
  324. }
  325. return S_OK;
  326. }