xmldomelement.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 341 行

CPP
341
字号
/* * Copyright 1999-2001,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Id: XMLDOMElement.cpp,v 1.3 2004/09/08 13:55:35 peiyongz Exp $ */#include "stdafx.h"#include "xml4com.h"#include "XMLDOMElement.h"#include "XMLDOMAttribute.h"#include "XMLDOMNodeList.h"// IXMLDOMElement methodsSTDMETHODIMP CXMLDOMElement::get_tagName(BSTR  *pVal){	ATLTRACE(_T("CXMLDOMElement::get_tagName\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	try	{		*pVal = SysAllocString(element->getTagName());	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}		return S_OK;}STDMETHODIMP CXMLDOMElement::getAttribute(BSTR name, VARIANT  *pVal){	ATLTRACE(_T("CXMLDOMElement::getAttribute\n"));	if (NULL == pVal)		return E_POINTER;	::VariantInit(pVal);	V_VT(pVal) = VT_EMPTY;	try {		V_VT(pVal)   = VT_BSTR;		V_BSTR(pVal) = SysAllocString(element->getAttribute(name));	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...) {		return E_FAIL;	}		return S_OK;}STDMETHODIMP CXMLDOMElement::setAttribute(BSTR name, VARIANT value){	ATLTRACE(_T("CXMLDOMElement::setAttribute\n"));	try	{		if (V_VT(&value) == VT_BSTR)		{			element->setAttribute(name, value.bstrVal);		}		else {			element->setAttribute(name,(BSTR) (_bstr_t) value);		}	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}		return S_OK;}STDMETHODIMP CXMLDOMElement::removeAttribute(BSTR name){	ATLTRACE(_T("CXMLDOMElement::removeAttribute\n"));	try	{		element->removeAttribute(name);	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}		return S_OK;}STDMETHODIMP CXMLDOMElement::getAttributeNode(BSTR name, IXMLDOMAttribute  **attr){	ATLTRACE(_T("CXMLDOMElement::getAttributeNode\n"));	if (NULL == attr)		return E_POINTER;	*attr = NULL;	DOMAttr* attrNode=element->getAttributeNode(name);	if(attrNode==NULL)		return S_OK;		CXMLDOMAttributeObj *pObj = NULL;	HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;	pObj->AddRef();	pObj->SetOwnerDoc(m_pIXMLDOMDocument);	try	{		pObj->attr = attrNode;	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast<LPVOID*> (attr));	if (S_OK != hr)		*attr = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMElement::setAttributeNode(IXMLDOMAttribute  *attr, IXMLDOMAttribute  **attributeNode){	ATLTRACE(_T("CXMLDOMElement::setAttributeNode\n"));	if (NULL == attr || NULL == attributeNode)		return E_POINTER;	*attributeNode = NULL;	DOMAttr* newAttr = NULL;	IIBMXMLDOMNodeIdentity* nodeID = NULL;	HRESULT sc = attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID);	if(SUCCEEDED(sc)) {		long id = 0;		sc = nodeID->get_NodeId(&id);		nodeID->Release();		if(SUCCEEDED(sc)) {			//			//   any subsequent failure will be reported as an invalid arg			//			sc = E_INVALIDARG;			try {				DOMNode* newNode = (DOMNode*) id;				if(newNode->getNodeType() == DOMNode::ATTRIBUTE_NODE) {					newAttr = (DOMAttr*) newNode;				}			}			catch(...) {			}		}	}	//	//   if we couldn't extract an attribute out of the	//       argument, then return with a failure code	if(newAttr == NULL) return sc;	sc = S_OK;	try	{		DOMAttr* oldAttr = element->setAttributeNode(newAttr);		if(oldAttr!=NULL) {			CXMLDOMAttributeObj *pObj = NULL;			sc = CXMLDOMAttributeObj::CreateInstance(&pObj);			if (SUCCEEDED(sc)) {				pObj->attr = oldAttr;				pObj->AddRef();				pObj->SetOwnerDoc(m_pIXMLDOMDocument);				sc = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast<LPVOID*> (attributeNode));				pObj->Release();			}		}	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}	return sc;}STDMETHODIMP CXMLDOMElement::removeAttributeNode(IXMLDOMAttribute  *attr, IXMLDOMAttribute  * *attributeNode){	ATLTRACE(_T("CXMLDOMElement::removeAttributeNode\n"));	if (NULL == attr || NULL == attributeNode)		return E_POINTER;	*attributeNode = NULL;	CXMLDOMAttributeObj *pObj = NULL;	HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(m_pIXMLDOMDocument);	try	{		long id = 0;		IIBMXMLDOMNodeIdentity* nodeID = NULL;		if(SUCCEEDED(attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID))) {			nodeID->get_NodeId(&id);			nodeID->Release();		}		pObj->attr = element->removeAttributeNode((DOMAttr*) id);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast<LPVOID*> (attributeNode));	if (S_OK != hr)		*attributeNode = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMElement::getElementsByTagName(BSTR tagName, IXMLDOMNodeList  **pVal){	ATLTRACE(_T("CXMLDOMElement::getElementsByTagName\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	CXMLDOMNodeListObj *pObj = NULL;	HRESULT hr = CXMLDOMNodeListObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(m_pIXMLDOMDocument);	try	{		pObj->m_container = element->getElementsByTagName(tagName);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMNodeList, reinterpret_cast<LPVOID*> (pVal));	if (S_OK != hr)		*pVal = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMElement::normalize(void){	ATLTRACE(_T("CXMLDOMElement::normalize\n"));	try	{		element->normalize();	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}		return S_OK;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?