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