⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xml.cpp

📁 自动投票程序: web 控件操作例程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <StdAfx.h>
#include "xml.h"

namespace Generic
{
	CXml::CXml(void)
	: m_strFilePath(_T(""))
	, m_pDoc(NULL)
	, m_emVersion(MSXML_UNKNOWN)
	{
	}

	CXml::~CXml(void)
	{
		Close();
	}

	//-------------------------------------------------------------------------
	// Function Name    :IsFileExist	[static]
	// Parameter(s)     :CString strFilePath
	// Return           :BOOL
	// Memo             :Whether the file exist
	//-------------------------------------------------------------------------
	BOOL CXml::IsFileExist(CString strFilePath)
	{
		BOOL bExist = FALSE;
		HANDLE hFile = NULL;

		hFile = CreateFile( strFilePath
			, GENERIC_READ
			, FILE_SHARE_READ | FILE_SHARE_WRITE
			, NULL
			, OPEN_EXISTING
			, 0
			, 0
			);

		if( hFile != INVALID_HANDLE_VALUE )
		{
			CloseHandle( hFile );
			bExist = TRUE;
		}

		return (bExist);
	}


	//-------------------------------------------------------------------------
	// Function Name    :CreateInstance
	// Parameter(s)     :
	// Return           :
	// Create			:2007-8-2 9:22 Jerry.Wang
	// Memo             :Create the MSXML instance
	//-------------------------------------------------------------------------
	BOOL CXml::CreateInstance(void)
	{
		Close();

		HRESULT hr = S_FALSE;

		hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60) );
		m_emVersion = (m_emVersion == 0 && hr == S_OK) ? MSXML60 : m_emVersion;	
		hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument30) );
		m_emVersion = (m_emVersion == 0 && hr == S_OK) ? MSXML30 : m_emVersion;
		hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument50) );
		m_emVersion = (m_emVersion == 0 && hr == S_OK) ? MSXML50 : m_emVersion;
		hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument40) );
		m_emVersion = (m_emVersion == 0 && hr == S_OK) ? MSXML40 : m_emVersion;		
		hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument26) );
		m_emVersion = (m_emVersion == 0 && hr == S_OK) ? MSXML26 : m_emVersion;
		hr = (hr == S_OK) ? hr : m_pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument) );
		m_emVersion = (m_emVersion == 0 && hr == S_OK) ? MSXML_UNKNOWN : m_emVersion;

//		CString strVer;
//		strVer.Format( _T("DOM Ver: %d"), m_emVersion );
//		::MessageBox( NULL, strVer, _T("E"), MB_OK );

		if( hr != S_OK ) 
		{
			// did u CoInitialize ?
			// did u install MSXML?
			ASSERT(FALSE);
			return FALSE;
		}

		m_pDoc->setProperty( _bstr_t(_T("SelectionLanguage")), _variant_t(_T("XPath")) );	// 3.0 only
		if( m_emVersion == MSXML40 )
			m_pDoc->setProperty( _bstr_t(_T("NewParser")), _variant_t(true) );

		m_pDoc->setProperty( _bstr_t(_T("AllowXsltScript")), _variant_t(true));
		m_pDoc->setProperty( _bstr_t(_T("AllowDocumentFunction")), _variant_t(true));
		m_pDoc->resolveExternals = VARIANT_TRUE; 
		m_pDoc->preserveWhiteSpace = VARIANT_FALSE;
		m_pDoc->validateOnParse = VARIANT_FALSE;
		m_strFilePath = _T("");
		m_mpNamespace.clear();

		return TRUE;
	}

	//-------------------------------------------------------------------------
	// Function Name    :Open
	// Parameter(s)     :LPCTSTR lpszXmlFilePath
	//					:LPCTSTR lpszRootName		The name of the root element if create
	// Return           :BOOL		false when failed
	// Memo             :open xml file, if not exist then create a new one
	//-------------------------------------------------------------------------
	BOOL CXml::Open( LPCTSTR lpszXmlFilePath )
	{
		HRESULT hr = S_FALSE;

		if( !IsFileExist(lpszXmlFilePath) )
			return FALSE;

		if( !CreateInstance() )
			return FALSE;

		m_strFilePath = lpszXmlFilePath;
		VARIANT_BOOL vbSuccessful = VARIANT_TRUE;

		try
		{
			vbSuccessful = m_pDoc->load( _variant_t(lpszXmlFilePath) );
		}
		catch( _com_error e )
		{
			TRACE( _T("CXml::Open( %s ) failed:%s\n"), lpszXmlFilePath, e.ErrorMessage());
			vbSuccessful = FALSE;
			ASSERT( FALSE );
		}
		catch(...)
		{
			vbSuccessful = FALSE;
			ASSERT( FALSE );
		}

		return (vbSuccessful == VARIANT_TRUE);
	}

	//-------------------------------------------------------------------------
	// Function Name    :Create
	// Parameter(s)     :lpszRootName		The name of the root node
	//					:lpszEncoding		The encoding of the xml file,[optional], e.g: UTF-8 / UTF-16 / ISO-8859-1 / GB2312
	//					:lpszPrefix			The prefix of the root node [optional]
	//					:lpszNamespaceURI	The namespace URL of the root node [optional]
	// Return           :BOOL
	// Create			:2008-1-16 14:22 Jerry.Wang
	// Memo             :Create a new xml file
	//-------------------------------------------------------------------------
	BOOL CXml::Create( LPCTSTR lpszRootName /* = _T("xmlRoot") */
		, LPCTSTR lpszEncoding /* = _T("UTF-8") */
		, LPCTSTR lpszPrefix /* = _T("") */
		, LPCTSTR lpszNamespaceURI /* = _T("") */
		)
	{
		HRESULT hr = S_FALSE;

		if( !CreateInstance() )
			return FALSE;

		m_strFilePath = _T("");
		VARIANT_BOOL vbSuccessful = VARIANT_TRUE;

		try
		{
			CString strProcessingInstruction;
			strProcessingInstruction.Format( _T("version=\"1.0\" encoding=\"%s\""), lpszEncoding);
			MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
			pPI = m_pDoc->createProcessingInstruction( _bstr_t(_T("xml")), _bstr_t(strProcessingInstruction) );
			if( pPI == NULL )
			{
				ASSERT(FALSE);
				return FALSE;
			}

			m_pDoc->appendChild(pPI);

			// create the root element
			CXmlNode root = CreateNode( lpszRootName, lpszPrefix, lpszNamespaceURI);
			m_pDoc->appendChild(root.m_pNode);

			vbSuccessful = SUCCEEDED(hr) ? VARIANT_TRUE : VARIANT_FALSE;
		}
		catch( _com_error e )
		{
			TRACE( _T("CXml::Create( %s, %s, %s, %s) failed:%s\n")
				, lpszRootName
				, lpszEncoding
				, lpszPrefix
				, lpszNamespaceURI
				, e.ErrorMessage()
				);
			vbSuccessful = FALSE;
			ASSERT( FALSE );
		}
		catch(...)
		{
			vbSuccessful = FALSE;
			ASSERT( FALSE );
		}

		return (vbSuccessful == VARIANT_TRUE);
	}

	//-------------------------------------------------------------------------
	// Function Name    :LoadXml
	// Parameter(s)     :LPCTSTR lpszXmlContent
	// Return           :BOOL
	// Memo             :Load the xml content
	//-------------------------------------------------------------------------
	BOOL CXml::LoadXml(LPCTSTR lpszXmlContent)
	{
		if( !CreateInstance() )
			return FALSE;

		VARIANT_BOOL vbSuccessful = VARIANT_TRUE;

		try
		{
			vbSuccessful = m_pDoc->loadXML( _bstr_t(lpszXmlContent) );
		}
		catch( _com_error e )
		{
			TRACE( _T("CXml::LoadXml failed:%s\n"), e.ErrorMessage());
			vbSuccessful = FALSE;
			ASSERT( FALSE );
		}
		catch(...)
		{
			vbSuccessful = FALSE;
			ASSERT( FALSE );
		}

		return (vbSuccessful == VARIANT_TRUE);
	}


	//-------------------------------------------------------------------------
	// 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    :GetXmlFile
	// Parameter(s)     :void
	// Return           :CString
	// Create			:2008-1-16 10:58 Jerry.Wang
	// Memo             :Get the path of the xml file
	//-------------------------------------------------------------------------
	CString CXml::GetXmlFile(void) const
	{
		return m_strFilePath;
	}


	//-------------------------------------------------------------------------
	// 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() );

⌨️ 快捷键说明

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