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 + -
显示快捷键?