//------------------------------------------------------------------------- // Function Name :Close // Parameter(s) :void // Return :void // Memo :Release //------------------------------------------------------------------------- void CXml::Close(void) { m_mpNamespace.clear(); m_strFilePath = _T(""); m_emVersion = MSXML_UNKNOWN; RELEASE_PTR(m_pDoc); }
//------------------------------------------------------------------------- // Function Name :CreateNode // Parameter(s) :LPCTSTR lpszName node local name // :LPCTSTR lpszPrefix node prefix // :LPCTSTR lpszNamespaceURI namespace URI // Return :CXmlNodePtr // Create :2007-8-2 9:59 Jerry.Wang //------------------------------------------------------------------------- CXmlNodePtr CXml::CreateNode(LPCTSTR lpszName , LPCTSTR lpszPrefix /* = _T("") */ , LPCTSTR lpszNamespaceURI /* = _T("") */ ) { ASSERT( m_pDoc != NULL ); CXmlNodePtr pChild( new CXmlNode() ); CString strName; strName.Format( _tcslen(lpszPrefix) > 0 ? _T("%s:%s") : _T("%s%s"), lpszPrefix, lpszName); try { MSXML2::IXMLDOMNodePtr pChildNode = NULL; pChildNode = m_pDoc->createNode(_variant_t(_T("element")), _bstr_t(strName), _bstr_t(lpszNamespaceURI) ); ASSERT( pChildNode != NULL ); pChild->m_pNode = pChildNode; RELEASE_PTR(pChildNode); } catch ( _com_error e ) { TRACE( _T("CXml::CreateNode( %s, %s, %s) failed:%s\n"), lpszName, lpszPrefix, lpszNamespaceURI, e.ErrorMessage()); ASSERT( FALSE ); } return pChild; }
//------------------------------------------------------------------------- // Function Name :EncodeBase64 // Parameter(s) :LPBYTE *pBuf The binary buffer // :ULONG ulSize size // Return :CString the result // Memo :encoding the binary buffer into Base64 string //------------------------------------------------------------------------- CString CXml::Base64Encode(LPBYTE pBuf, ULONG ulSize) { ASSERT( m_pDoc != NULL ); ASSERT( pBuf != NULL ); CString strRet = _T(""); try { MSXML2::IXMLDOMElementPtr pElement = NULL; pElement = m_pDoc->createElement( _bstr_t(_T("Base64")) ); ASSERT( pElement != NULL ); HRESULT hr = S_OK; hr = pElement->put_dataType( _bstr_t(_T("bin.base64")) ); ASSERT( SUCCEEDED(hr) ); SAFEARRAY * pAry = SafeArrayCreateVector( VT_UI1, 0L, ulSize); ::memcpy( pAry->pvData, pBuf, ulSize); VARIANT var; VariantInit(&var); var.parray = pAry; var.vt = VT_ARRAY | VT_UI1; pElement->nodeTypedValue = var; BSTR bstr = NULL; hr = pElement->get_text( &bstr ); ASSERT( SUCCEEDED(hr) ); strRet = (LPCTSTR)_bstr_t( bstr, true); if( bstr != NULL ) { SysFreeString(bstr); bstr = NULL; } RELEASE_PTR(pElement); } catch ( _com_error e ) { TRACE( _T("CXml::Base64Encode failed:%s\n"), e.ErrorMessage()); ASSERT( FALSE ); } return strRet; }
//------------------------------------------------------------------------- // Function Name :CreateNode // Parameter(s) :CString strName 结点名称 // Return :CXmlNodePtr // Memo :创建结点 //------------------------------------------------------------------------- CXmlNodePtr CXml::CreateNode(LPCTSTR pszName) { ASSERT(m_pDoc != NULL); CXmlNodePtr pChild(new CXmlNode()); try { MSXML2::IXMLDOMNodePtr pChildNode = NULL; pChildNode = m_pDoc->createElement(_bstr_t(pszName)); ASSERT(pChildNode != NULL); pChild->m_pNode = pChildNode; RELEASE_PTR(pChildNode); } catch (_com_error e) { TRACE(_T("CXml::CreateNode 发生异常:%s\n"), e.ErrorMessage()); ASSERT(FALSE); } return pChild; }
//------------------------------------------------------------------------- // Function Name :Base64Decode // Parameter(s) :LPCTSTR pszIn Base64编码 // :LPBYTE pBuf 缓冲区首地址 // :ULONG &ulSize 缓冲区大小 // Return :BOOL // Memo :将Base64编码解码为二进制形式 // 注意!此函数的缓冲区需要在函数调用完后删除 //------------------------------------------------------------------------- BOOL CXml::Base64Decode(LPCTSTR pszIn, LPBYTE& pBuf, LONG& lSize) { ASSERT(m_pDoc != NULL); try { MSXML2::IXMLDOMElementPtr pElement = NULL; pElement = m_pDoc->createElement(_bstr_t(_T("Base64"))); ASSERT(pElement != NULL); HRESULT hr = S_OK; hr = pElement->put_dataType(_bstr_t(_T("bin.base64"))); ASSERT(SUCCEEDED(hr)); hr = pElement->put_text(CComBSTR(pszIn)); ASSERT(SUCCEEDED(hr)); hr = SafeArrayGetUBound(pElement->nodeTypedValue.parray, 1, &lSize); ASSERT(SUCCEEDED(hr)); lSize ++; pBuf = new BYTE[lSize]; memset(pBuf, 0, lSize); memcpy(pBuf, LPVOID(pElement->nodeTypedValue.parray->pvData), lSize); RELEASE_PTR(pElement); } catch (_com_error e) { TRACE(_T("CXml::Base64Decode 发生异常:%s\n"), e.ErrorMessage()); ASSERT(FALSE); return FALSE; } return TRUE; }
//------------------------------------------------------------------------- // Function Name :GetRoot // Parameter(s) : // Return : // Memo :get the root element //------------------------------------------------------------------------- CXmlNodePtr CXml::GetRoot(void) { ASSERT( m_pDoc != NULL ); CXmlNodePtr pNode( new CXmlNode() ); try { MSXML2::IXMLDOMElementPtr pElement = NULL; HRESULT hr = m_pDoc->get_documentElement(&pElement); ASSERT( SUCCEEDED(hr) ); ASSERT( pElement != NULL ); pNode->m_pNode = pElement; RELEASE_PTR(pElement); } catch ( _com_error e ) { TRACE( _T("CXml::GetRoot failed:%s\n"), e.ErrorMessage()); ASSERT( FALSE ); } return pNode; }
//------------------------------------------------------------------------- // Function Name :GetLastError // Parameter(s) :void // Return :CString // Memo :获取最后的出错信息 //------------------------------------------------------------------------- CString CXml::GetLastError(void) const { ASSERT(m_pDoc != NULL); HRESULT hr = S_OK; MSXML2::IXMLDOMParseErrorPtr pIParseError = NULL; hr = m_pDoc->get_parseError(&pIParseError); ASSERT(SUCCEEDED(hr)); CString strRet; if(pIParseError != NULL) { BSTR bstr = NULL; hr = pIParseError->get_reason(&bstr); ASSERT(SUCCEEDED(hr)); strRet = (LPCTSTR)_bstr_t(bstr, false); RELEASE_PTR(pIParseError); } return strRet; }
//------------------------------------------------------------------------- // Function Name :SaveWithFormatted // Parameter(s) :LPCTSTR lpszFilePath [in, optional] // :LPCTSTR lpszEncoding [in, optional] // Return :BOOL // Memo :Save the xml file in formatted // History :V3.1 Thanks roel_'s advice to support formatted output //------------------------------------------------------------------------- BOOL CXml::SaveWithFormatted(LPCTSTR lpszFilePath /* = NULL */, LPCTSTR lpszEncoding /* = _T("UTF-8") */) { if( m_pDoc == NULL ) { ASSERT(FALSE); return FALSE; } HRESULT hr = S_OK; MSXML2::IMXWriterPtr pMXWriter = NULL; MSXML2::ISAXXMLReaderPtr pSAXReader = NULL; MSXML2::ISAXContentHandlerPtr pISAXContentHandler = NULL; MSXML2::ISAXErrorHandlerPtr pISAXErrorHandler = NULL; MSXML2::ISAXDTDHandlerPtr pISAXDTDHandler = NULL; try { // create hr = pMXWriter.CreateInstance( __uuidof(MSXML2::MXXMLWriter)); if( FAILED(hr) ){ ASSERT(FALSE); goto lblErrorHandlerForSave; } hr = pSAXReader.CreateInstance( __uuidof(MSXML2::SAXXMLReader)); if( FAILED(hr) ){ ASSERT(FALSE); goto lblErrorHandlerForSave; } // save in formatted pISAXContentHandler = pMXWriter; pISAXErrorHandler = pMXWriter; pISAXDTDHandler = pMXWriter; if (FAILED (pMXWriter->put_omitXMLDeclaration (VARIANT_FALSE)) || FAILED (pMXWriter->put_standalone (VARIANT_FALSE)) || FAILED (pMXWriter->put_indent (VARIANT_TRUE)) || FAILED (pMXWriter->put_encoding(_bstr_t(lpszEncoding)) ) ) { ASSERT(FALSE); goto lblErrorHandlerForSave; } if (FAILED(pSAXReader->putContentHandler (pISAXContentHandler)) || FAILED(pSAXReader->putDTDHandler (pISAXDTDHandler)) || FAILED(pSAXReader->putErrorHandler (pISAXErrorHandler)) || FAILED(pSAXReader->putProperty ((unsigned short*)L"http://xml.org/sax/properties/lexical-handler", _variant_t(pMXWriter.GetInterfacePtr()))) || FAILED(pSAXReader->putProperty ((unsigned short*)L"http://xml.org/sax/properties/declaration-handler", _variant_t(pMXWriter.GetInterfacePtr())))) { ASSERT(FALSE); goto lblErrorHandlerForSave; } IStream * pOutStream = NULL; ::CreateStreamOnHGlobal( NULL, TRUE, &pOutStream); hr = pMXWriter->put_output(_variant_t(pOutStream)); if( FAILED(hr) ){ ASSERT(FALSE); goto lblErrorHandlerForSave; } hr = pSAXReader->parse(m_pDoc.GetInterfacePtr()); if( FAILED(hr) ){ ASSERT(FALSE); goto lblErrorHandlerForSave; } if( lpszFilePath == NULL ) { ASSERT(!m_strFilePath.IsEmpty()); if( !CXml::SaveStreamToFile( pOutStream, m_strFilePath) ) return FALSE; } else { if( !CXml::SaveStreamToFile( pOutStream, lpszFilePath) ) return FALSE; m_strFilePath = lpszFilePath; } } catch ( _com_error e ) { TRACE( _T("CXml::SaveWithFormatted( %s ) failed:%s\n"), lpszFilePath, e.ErrorMessage()); ASSERT( FALSE ); hr = e.Error(); } lblErrorHandlerForSave: RELEASE_PTR(pISAXDTDHandler); RELEASE_PTR(pISAXErrorHandler); RELEASE_PTR(pISAXContentHandler); RELEASE_PTR(pSAXReader); RELEASE_PTR(pMXWriter); return SUCCEEDED(hr); }
//------------------------------------------------------------------------- // Function Name :Close // Parameter(s) :void // Return :void // Create :2008-1-16 16:10 Jerry.Wang // Memo :Close the xsl file //------------------------------------------------------------------------- void CXsl::Close(void) { RELEASE_PTR(m_pIXSLTemplate); RELEASE_PTR(m_pStyleSheet); RELEASE_PTR(m_pIXSLProcessor); }
//------------------------------------------------------------------------- // Function Name :Close // Parameter(s) :void // Return :void // Memo :关闭 //------------------------------------------------------------------------- void CXml::Close(void) { RELEASE_PTR(m_pDoc); }