xmldomdocument.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 1,597 行 · 第 1/3 页

CPP
1,597
字号
	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::createCDATASection(BSTR data, IXMLDOMCDATASection  **cdata){	ATLTRACE(_T("CXMLDOMDocument::createCDATASection\n"));	if (NULL == cdata)		return E_POINTER;	*cdata = NULL;	CXMLDOMCDATASectionObj *pObj = NULL;	HRESULT hr = CXMLDOMCDATASectionObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->cdataSection = m_Document->createCDATASection(data);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMCDATASection, reinterpret_cast<LPVOID*> (cdata));	if (S_OK != hr)		*cdata = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::createProcessingInstruction(BSTR target, BSTR data, IXMLDOMProcessingInstruction  **pVal){	ATLTRACE(_T("CXMLDOMDocument::createProcessingInstruction\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	CXMLDOMProcessingInstructionObj *pObj = NULL;	HRESULT hr = CXMLDOMProcessingInstructionObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->processingInstruction = m_Document->createProcessingInstruction(target, data);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMProcessingInstruction, reinterpret_cast<LPVOID*> (pVal));	if (S_OK != hr)		*pVal = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::createAttribute(BSTR name, IXMLDOMAttribute  **attr){	ATLTRACE(_T("CXMLDOMDocument::createAttribute\n"));	if (NULL == attr)		return E_POINTER;	*attr = NULL;	CXMLDOMAttributeObj *pObj = NULL;	HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->attr = m_Document->createAttribute(name);	}	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 CXMLDOMDocument::createEntityReference(BSTR name, IXMLDOMEntityReference  **entityRef){	ATLTRACE(_T("CXMLDOMDocument::createEntityReference\n"));	if (NULL == entityRef)		return E_POINTER;	*entityRef = NULL;	CXMLDOMEntityReferenceObj *pObj = NULL;	HRESULT hr = CXMLDOMEntityReferenceObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->entityReference = m_Document->createEntityReference(name);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMEntityReference, reinterpret_cast<LPVOID*> (entityRef));	if (S_OK != hr)		*entityRef = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::getElementsByTagName(BSTR tagName, IXMLDOMNodeList  **pVal){	ATLTRACE(_T("CXMLDOMDocument::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 = m_Document->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 CXMLDOMDocument::createNode(VARIANT TYPE, BSTR name, BSTR namespaceURI, IXMLDOMNode  **pVal){	ATLTRACE(_T("CXMLDOMDocument::createNode\n"));	HRESULT hr = S_OK;	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	VARIANT type;	::VariantInit(&type);	if (V_VT(&TYPE) != VT_I4 && V_VT(&TYPE) != VT_BSTR)		hr = ::VariantChangeType(&type,&TYPE,0,VT_I4); 		else		hr = ::VariantCopy(&type,&TYPE);		if (S_OK != hr)		return hr;	DOMNodeType nodeType = NODE_INVALID;	if (VT_I4 == V_VT(&type))		nodeType = static_cast<DOMNodeType> (V_I4(&type));	else {		OLECHAR* str = V_BSTR(&type);		for (int i = 0; i < g_DomNodeNameSize; ++i) {			if (0 == _wcsicmp(str,g_DomNodeName[i])) {				nodeType = static_cast<DOMNodeType> (i);				break;			}		}	}	::VariantClear(&type);		if (NODE_INVALID		== nodeType ||		NODE_DOCUMENT		== nodeType	||		NODE_DOCUMENT_TYPE	== nodeType	||		NODE_ENTITY			== nodeType ||		NODE_NOTATION		== nodeType)		return E_FAIL;	try	{	switch(nodeType) {		case NODE_ELEMENT:		{			DOMElement* node;			if (SysStringLen(namespaceURI) > 0)				node = m_Document->createElementNS(namespaceURI,name);			else				node = m_Document->createElement(name);						hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		case NODE_ATTRIBUTE:		{			DOMAttr* node;			if (SysStringLen(namespaceURI) > 0)				node = m_Document->createAttributeNS(namespaceURI,name);			else				node = m_Document->createAttribute(name);			hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		case NODE_TEXT:		{			DOMText* node = m_Document->createTextNode(OLESTR(""));			hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		case NODE_CDATA_SECTION:		{			DOMCDATASection* node = m_Document->createCDATASection(OLESTR(""));			hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		case NODE_ENTITY_REFERENCE:		{			DOMEntityReference* node = m_Document->createEntityReference(name);			hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		case NODE_PROCESSING_INSTRUCTION:		{			DOMProcessingInstruction* node = m_Document->createProcessingInstruction(name,OLESTR(""));			hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		case NODE_COMMENT:		{			DOMComment* node = m_Document->createComment(OLESTR(""));			hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		case NODE_DOCUMENT_FRAGMENT:		{			DOMDocumentFragment* node = m_Document->createDocumentFragment();			hr = wrapNode(m_pIXMLDOMDocument,node,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));			break;		}		default:			hr = E_FAIL;			break;	}	}	catch(DOMException& ex)	{		hr = MakeHRESULT(ex);	}	catch (...)	{		hr = E_FAIL;	}		return hr;}STDMETHODIMP CXMLDOMDocument::nodeFromID(BSTR idString, IXMLDOMNode  **pVal){	ATLTRACE(_T("CXMLDOMDocument::nodeFromID\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	HRESULT hr = S_OK;	try	{		hr = wrapNode(m_pIXMLDOMDocument, m_Document->getElementById(idString),IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}		return hr;}STDMETHODIMP CXMLDOMDocument::load(VARIANT xmlSource, VARIANT_BOOL  *isSuccessful){	ATLTRACE(_T("CXMLDOMDocument::load\n"));	if (NULL == isSuccessful)		return E_POINTER;	*isSuccessful = VARIANT_FALSE;	if (V_VT(&xmlSource) != VT_BSTR					&&		V_VT(&xmlSource) != VT_DISPATCH				&&		V_VT(&xmlSource) != (VT_ARRAY | VT_VARIANT)	&&		V_VT(&xmlSource) != (VT_ARRAY | VT_UI1)		&&		V_VT(&xmlSource) != VT_UNKNOWN)		return E_INVALIDARG;	// do not start another thread if there is another active	if (NULL != m_hParseThread) {		DWORD exitCode = 0;		BOOL rc = ::GetExitCodeThread(m_hParseThread, &exitCode);		if (!rc || STILL_ACTIVE == exitCode)			return S_OK;				::CloseHandle(m_hParseThread);		m_hParseThread = NULL;	}	HRESULT hr = S_OK;	m_bAbort = false;		m_FileName = _T("");	m_xml = _T("");	m_TmpDocument = 0;	m_bThreadValidate = m_bValidate;		if (V_VT(&xmlSource) == VT_BSTR) {		m_FileName = V_BSTR(&xmlSource);		if (0 == m_FileName.length())			return E_INVALIDARG;		// see if the file is relative path		if (!PathIsURL(m_FileName) && PathIsRelative(m_FileName)) {			// try appending baseurl if exists			_bstr_t baseURL;			if (S_OK == GetBaseURL(baseURL)) {				// change any backslashes to slashes				LPTSTR loc = _tcschr(m_FileName,_T('\\'));				while (loc != NULL) {					*loc = _T('/');					loc = _tcschr(m_FileName,_T('\\'));				}				m_FileName = baseURL + _T("/") + m_FileName;			}			else {				TCHAR szCurDir[MAX_PATH];				GetCurrentDirectory(MAX_PATH,szCurDir);				m_FileName=_bstr_t(szCurDir) + _T("\\") + m_FileName;			}		}	}	else	if (V_VT(&xmlSource) == VT_UNKNOWN) {		CComQIPtr<IStream,&IID_IStream> pS(V_UNKNOWN(&xmlSource));		if (!pS)			return E_INVALIDARG;		CComBSTR b;		hr = b.ReadFromStream(pS);		if (S_OK != hr)			return hr;		m_xml = b;		if (0 == m_xml.length())			return E_INVALIDARG;	}	else	if (V_VT(&xmlSource) == VT_DISPATCH) {		CComQIPtr<IXMLDOMDocument,&IID_IXMLDOMDocument> pDoc(V_DISPATCH(&xmlSource));		if (!pDoc)			return E_INVALIDARG;				BSTR b = NULL;		hr = pDoc->get_xml(&b);		if (S_OK != hr)			return hr;		m_xml = b;		::SysFreeString(b);		if (0 == m_xml.length())			return E_INVALIDARG;	}	else	if (V_VT(&xmlSource) == (VT_ARRAY | VT_VARIANT)) {		SAFEARRAY *pArray = reinterpret_cast<SAFEARRAY *> (xmlSource.byref);		if (NULL == pArray)			return E_INVALIDARG;		long lLBoundVar = 0;		long lUBoundVar = 0;			UINT dims = ::SafeArrayGetDim(pArray);		if (dims == 0)			return E_INVALIDARG;			hr = ::SafeArrayGetLBound(pArray, dims, &lLBoundVar);		if (S_OK != hr)			return hr;		hr = ::SafeArrayGetUBound(pArray, dims, &lUBoundVar);		if (S_OK != hr)			return hr;		if (lUBoundVar >= lLBoundVar) {			VARIANT *pIndex = NULL;			hr = ::SafeArrayAccessData(pArray, reinterpret_cast<void **> (&pIndex));			if (S_OK != hr)				return hr;			int length = lUBoundVar-lLBoundVar+2;			BYTE *body = new BYTE[length];			for (long i = 0; i <= lUBoundVar-lLBoundVar; ++i) {					VARIANT var = pIndex[i];				if (V_VT(&var) != VT_UI1) {					hr = E_INVALIDARG;					break;				}				body[i] = V_UI1(&var);			}			body[length-1] = 0;								::SafeArrayUnaccessData(pArray);			if (S_OK != hr) {				delete [] body;				return hr;			}			m_xml = reinterpret_cast<char*> (body);			delete [] body;			if (0 == m_xml.length())				return E_INVALIDARG;		}	}		else	if (V_VT(&xmlSource) == (VT_ARRAY | VT_UI1)) {		SAFEARRAY *pArray = reinterpret_cast<SAFEARRAY *> (xmlSource.byref);		if (NULL == pArray)			return E_INVALIDARG;		long lLBoundVar = 0;		long lUBoundVar = 0;			UINT dims = ::SafeArrayGetDim(pArray);		if (dims == 0)			return E_INVALIDARG;			hr = ::SafeArrayGetLBound(pArray, dims, &lLBoundVar);		if (S_OK != hr)			return hr;		hr = ::SafeArrayGetUBound(pArray, dims, &lUBoundVar);		if (S_OK != hr)			return hr;		if (lUBoundVar >= lLBoundVar) {			BYTE *pIndex = NULL;			hr = ::SafeArrayAccessData(pArray, reinterpret_cast<void **> (&pIndex));			if (S_OK != hr)				return hr;			int length = lUBoundVar-lLBoundVar+2;			BYTE *body = new BYTE[length];			for (long i = 0; i <= lUBoundVar-lLBoundVar; ++i)					body[i] = pIndex[i];						body[length-1] = 0;			::SafeArrayUnaccessData(pArray);			m_xml = reinterpret_cast<char*> (body);			delete [] body;			if (0 == m_xml.length())				return E_INVALIDARG;		}	}	

⌨️ 快捷键说明

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