예제 #1
0
	//-------------------------------------------------------------------------
	// 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);
	}
예제 #2
0
	//-------------------------------------------------------------------------
	// 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;
	}
예제 #3
0
	//-------------------------------------------------------------------------
	// 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;
	}
예제 #4
0
//-------------------------------------------------------------------------
// 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;
}
예제 #5
0
//-------------------------------------------------------------------------
// 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;
}
예제 #6
0
	//-------------------------------------------------------------------------
	// 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;
	}
예제 #7
0
//-------------------------------------------------------------------------
// 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;
}
예제 #8
0
	//-------------------------------------------------------------------------
	// 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);
	}
예제 #9
0
파일: Xsl.cpp 프로젝트: boogunote/bn1
	//-------------------------------------------------------------------------
	// 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);	
	}
예제 #10
0
//-------------------------------------------------------------------------
// Function Name    :Close
// Parameter(s)     :void
// Return           :void
// Memo             :关闭
//-------------------------------------------------------------------------
void CXml::Close(void)
{
	RELEASE_PTR(m_pDoc);
}