xmldomdocument.cpp

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

CPP
1,597
字号
/* * 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: XMLDOMDocument.cpp,v 1.8 2004/09/08 13:55:35 peiyongz Exp $ */#include "stdafx.h"#include <xercesc/parsers/XercesDOMParser.hpp>#include <xercesc/sax/SAXParseException.hpp>#include <xercesc/framework/MemBufInputSource.hpp>#include <xercesc/dom/DOMImplementation.hpp>#include "xml4com.h"#include "XMLDOMDocument.h"#include "XMLDOMUtil.h"#include "XMLDOMNodeList.h"#include "XMLDOMNamedNodeMap.h"#include "XMLDOMDocumentType.h"#include "XMLDOMImplementation.h"#include "XMLDOMElement.h"#include "XMLDOMDocumentFragment.h"#include "XMLDOMText.h"#include "XMLDOMComment.h"#include "XMLDOMCDATASection.h"#include "XMLDOMProcessingInstruction.h"#include "XMLDOMAttribute.h"#include "XMLDOMEntityReference.h"#include "BindStatusCallback.h"// I need to make sure the file is registered with long filenamesHRESULT WINAPI CXMLDOMDocument::UpdateRegistry(BOOL bRegister){	USES_CONVERSION;	TCHAR file[MAX_PATH];	if (::GetModuleFileName(_Module.m_hInst, file, MAX_PATH)) {		WIN32_FIND_DATA d;		memset(&d,0,sizeof(WIN32_FIND_DATA));		HANDLE h = FindFirstFile(file,&d);		if (h != INVALID_HANDLE_VALUE) {			TCHAR  *name = _tcsrchr(file,_T('\\'));			TCHAR newFile[MAX_PATH] = _T("");			_tcsncpy(newFile,file,name-file);			_tcscat(newFile,_T("\\"));			_tcscat(newFile,d.cFileName);			FindClose(h);						_ATL_REGMAP_ENTRY regmap[2] = {{NULL,NULL},{NULL,NULL}};			regmap[0].szKey  = OLESTR("XMLMODULE");			regmap[0].szData = T2OLE(newFile);			return _Module.UpdateRegistryFromResource((UINT) IDR_XMLDOCUMENT, bRegister,regmap);		}	}	return E_FAIL;}CXMLDOMDocument::CXMLDOMDocument()	:m_Document					(NULL)	,m_bValidate				(false)	,m_lReadyState				(0)	,m_url						(_T(""))	,m_pParseError				(NULL)	,m_bAsync					(false)	,m_bAbort					(false)	,m_hParseThread				(NULL)	,m_pOnReadyStateChange		(NULL)	,m_pOnDataAvailable			(NULL)	,m_pOnTransformNode			(NULL)	,m_FileName					(_T(""))	,m_xml						(_T(""))	,m_bParseError				(false)	,m_bThreadValidate			(false)	,m_bPreserveWhiteSpace      (false)    ,m_TmpDocument              (NULL){}HRESULT CXMLDOMDocument::FinalConstruct(){	// create monitor window	RECT rc;    memset(&rc,0,sizeof(RECT));	if (NULL == Create(NULL, rc, _T("XML Parse Monitor Window"), 0))		return E_FAIL;	HRESULT hr = CXMLDOMParseErrorObj::CreateInstance(&m_pParseError);	if (S_OK != hr)		return hr;		m_pParseError->AddRef();	m_pIXMLDOMDocument = this;    m_Document = DOMImplementation::getImplementation()->createDocument();	return hr;}void CXMLDOMDocument::FinalRelease(){	if (NULL != m_hParseThread) {		m_bAbort = true;		::WaitForSingleObject(m_hParseThread, INFINITE);		::CloseHandle(m_hParseThread);		m_hParseThread = NULL;	}	if (m_pParseError != NULL) {		m_pParseError->Release();		m_pParseError = NULL;	}	if (m_pOnReadyStateChange != NULL) {		m_pOnReadyStateChange->Release();		m_pOnReadyStateChange = NULL;	}	if (m_pOnDataAvailable != NULL) {		m_pOnDataAvailable->Release();		m_pOnDataAvailable = NULL;	}	if (m_pOnTransformNode != NULL) {		m_pOnTransformNode->Release();		m_pOnTransformNode = NULL;	}    if(m_Document)        delete m_Document;    m_Document = NULL;	DestroyWindow();}void CXMLDOMDocument::warning(const SAXParseException& exc){	// ignore warnings}void CXMLDOMDocument::error(const SAXParseException& exc){	m_pParseError->SetData(1,						   exc.getSystemId(),						   exc.getMessage(),						   _T(""),						   exc.getLineNumber(),						   exc.getColumnNumber(),						   0);	m_bParseError = true;}void CXMLDOMDocument::fatalError(const SAXParseException& exc){	m_pParseError->SetData(1,						   exc.getSystemId(),						   exc.getMessage(),						   _T(""),						   exc.getLineNumber(),						   exc.getColumnNumber(),						   0);	m_bParseError = true;}LRESULT CXMLDOMDocument::OnReadyStateChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){	ATLTRACE(_T("CXMLDOMDocument::OnReadyStateChange\n"));	bHandled = TRUE;	m_lReadyState = wParam;	Fire_onreadystatechange();	if (NULL != m_pOnReadyStateChange) {		CComVariant varResult;		DISPPARAMS disp = { NULL, NULL, 0, 0 };		m_pOnReadyStateChange->Invoke(DISPID_VALUE, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);	}	if (m_lReadyState != 4)		return 1L;    if(m_Document)        delete m_Document;	m_Document = m_TmpDocument;	m_TmpDocument = 0;		m_url = m_FileName;	if (!m_bParseError) {		Fire_ondataavailable();		if (NULL != m_pOnDataAvailable) {			CComVariant varResult;			DISPPARAMS disp = { NULL, NULL, 0, 0 };			m_pOnDataAvailable->Invoke(DISPID_VALUE, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);		}	}	return 1L;}STDMETHODIMP CXMLDOMDocument::InterfaceSupportsErrorInfo(REFIID riid){	if (IsEqualGUID(IID_IXMLDOMDocument,riid))		return S_OK;	return S_FALSE;}STDMETHODIMP CXMLDOMDocument::get_doctype(IXMLDOMDocumentType  **pVal){	ATLTRACE(_T("CXMLDOMDocument::get_doctype\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	DOMDocumentType* doctype = m_Document->getDoctype();	//	//   if the document had no doctype then return a null object	//	if(doctype==NULL)		return S_OK;	CXMLDOMDocumentTypeObj *pObj = NULL;	HRESULT hr = CXMLDOMDocumentTypeObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->documentType = doctype;	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMDocumentType, reinterpret_cast<LPVOID*> (pVal));	if (S_OK != hr)		*pVal = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::get_implementation(IXMLDOMImplementation  **pVal){	ATLTRACE(_T("CXMLDOMDocument::get_implementation\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	CXMLDOMImplementationObj *pObj = NULL;	HRESULT hr = CXMLDOMImplementationObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	hr = pObj->QueryInterface(IID_IXMLDOMImplementation, reinterpret_cast<LPVOID*> (pVal));	if (S_OK != hr)		*pVal = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::get_documentElement(IXMLDOMElement  * *pVal){	ATLTRACE(_T("CXMLDOMDocument::get_documentElement\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	CXMLDOMElementObj *pObj = NULL;	HRESULT hr = CXMLDOMElementObj::CreateInstance(&pObj);	if (S_OK != hr)		return S_OK;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->element = m_Document->getDocumentElement();	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return S_OK;	}		hr = pObj->QueryInterface(IID_IXMLDOMElement, reinterpret_cast<LPVOID*> (pVal));	if (S_OK != hr)		*pVal = NULL;	pObj->Release();	return S_OK;}STDMETHODIMP CXMLDOMDocument::putref_documentElement(IXMLDOMElement  *newVal){	ATLTRACE(_T("CXMLDOMDocument::putref_documentElement\n"));	DOMElement* elem;	try	{		elem = m_Document->getDocumentElement();		if (NULL == newVal && elem!=NULL) {			m_Document->removeChild(elem);			return S_OK;		}	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}			CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pNewVal(newVal);	if (!pNewVal)		return E_NOINTERFACE;	long id = 0;	HRESULT hr = pNewVal->get_NodeId(&id);	if (S_OK != hr)		return hr;	DOMNode *pNewValNode = reinterpret_cast<DOMNode*> (id);	if (NULL == pNewValNode)		return E_INVALIDARG;	try	{		if(elem==NULL)			m_Document->appendChild(pNewValNode);		else			m_Document->replaceChild(pNewValNode, elem);	}	catch(DOMException& ex)	{		return MakeHRESULT(ex);	}	catch(...)	{		return E_FAIL;	}		return S_OK;}STDMETHODIMP CXMLDOMDocument::createElement(BSTR tagName, IXMLDOMElement  **pVal){	ATLTRACE(_T("CXMLDOMDocument::createElement\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	CXMLDOMElementObj *pObj = NULL;	HRESULT hr = CXMLDOMElementObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->element = m_Document->createElement(tagName);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMElement, reinterpret_cast<LPVOID*> (pVal));	if (S_OK != hr)		*pVal = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::createDocumentFragment(IXMLDOMDocumentFragment  **docFrag){	ATLTRACE(_T("CXMLDOMDocument::createDocumentFragment\n"));	if (NULL == docFrag)		return E_POINTER;	*docFrag = NULL;	CXMLDOMDocumentFragmentObj *pObj = NULL;	HRESULT hr = CXMLDOMDocumentFragmentObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->documentFragment = m_Document->createDocumentFragment();	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMDocumentFragment, reinterpret_cast<LPVOID*> (docFrag));	if (S_OK != hr)		*docFrag = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::createTextNode(BSTR data, IXMLDOMText  **pVal){	ATLTRACE(_T("CXMLDOMDocument::createTextNode\n"));	if (NULL == pVal)		return E_POINTER;	*pVal = NULL;	CXMLDOMTextObj *pObj = NULL;	HRESULT hr = CXMLDOMTextObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->text = m_Document->createTextNode(data);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMText, reinterpret_cast<LPVOID*> (pVal));	if (S_OK != hr)		*pVal = NULL;	pObj->Release();	return hr;}STDMETHODIMP CXMLDOMDocument::createComment(BSTR data, IXMLDOMComment  **comment){	ATLTRACE(_T("CXMLDOMDocument::createComment\n"));	if (NULL == comment)		return E_POINTER;	*comment = NULL;	CXMLDOMCommentObj *pObj = NULL;	HRESULT hr = CXMLDOMCommentObj::CreateInstance(&pObj);	if (S_OK != hr)		return hr;		pObj->AddRef();	pObj->SetOwnerDoc(this);	try	{		pObj->comment = m_Document->createComment(data);	}	catch(DOMException& ex)	{		pObj->Release();		return MakeHRESULT(ex);	}	catch(...)	{		pObj->Release();		return E_FAIL;	}		hr = pObj->QueryInterface(IID_IXMLDOMComment, reinterpret_cast<LPVOID*> (comment));	if (S_OK != hr)		*comment = NULL;

⌨️ 快捷键说明

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