www.pudn.com > MarkUpTest.rar > XmlAccess.cpp


// XmlAccess.cpp: implementation of the CXmlAccess class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "XmlAccess.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
using namespace MSXML2; 
 
CXmlAccess::CXmlAccess() 
{ 
	HRESULT hr; 
	try 
	{ 
		hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument40)); 
		pXMLDoc->async =  VARIANT_FALSE;  
		 
		hr = pXSDDoc.CreateInstance(__uuidof(DOMDocument40)); 
		pXSDDoc->async =  VARIANT_FALSE;  
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
	} 
 
} 
 
CXmlAccess::~CXmlAccess() 
{ 
 
} 
 
BOOL CXmlAccess::InitXSD(const _variant_t & xsdFile) 
{ 
	HRESULT hr;  
	try 
	{ 
		hr = pXSDDoc->load(xsdFile);       
		 
		// check on the parser error       
		if(hr!=VARIANT_TRUE) 
		{ 
			checkParseError(pXSDDoc->parseError); 
			return FALSE; 
		} 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
 
	return TRUE; 
} 
 
BOOL CXmlAccess::LoadXML(_bstr_t xmlString) 
{ 
	HRESULT hr;  
	try 
	{ 
		hr = pXMLDoc->loadXML(xmlString); 
		 
		// check on the parser error       
		if(hr!=VARIANT_TRUE) 
		{ 
			checkParseError(pXMLDoc->parseError); 
			return FALSE; 
		} 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
 
	return TRUE; 
} 
 
BOOL CXmlAccess::LoadXML(const _variant_t & xmlFile) 
{ 
	HRESULT hr;  
	try 
	{ 
		hr = pXMLDoc->load(xmlFile);       
		 
		// check on the parser error       
		if(hr!=VARIANT_TRUE) 
		{ 
			checkParseError(pXMLDoc->parseError); 
			return FALSE; 
		} 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
 
	return TRUE; 
} 
 
BOOL CXmlAccess::VerifyXML(_bstr_t nameSpace) 
{ 
	// create schemacache 
	HRESULT hr;  
	try 
	{ 
		IXMLDOMSchemaCollectionPtr pSchemaCache; 
		IXMLDOMParseErrorPtr  pError; 
		 
		hr = pSchemaCache.CreateInstance(__uuidof(XMLSchemaCache40)); 
		 
		pXMLDoc->schemas = pSchemaCache.GetInterfacePtr(); 
		 
		// hook it up with XML Document 
		hr = pSchemaCache->add(nameSpace, pXSDDoc.GetInterfacePtr());    
		 
		// call validate  
		pError = pXMLDoc->validate(); 
		 
		if (pError->errorCode != S_OK) 
		{ 
			_bstr_t parseError = _bstr_t("Error code: ")+ _bstr_t(pError->errorCode) +_bstr_t("\n") + _bstr_t("Reason: ")+ pError->Getreason(); 
			::MessageBox(NULL, (char*)parseError, "Parse Error",MB_OK); 
			return FALSE; 
		} 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
	 
	return TRUE; 
} 
 
void CXmlAccess::checkParseError(IXMLDOMParseErrorPtr pError) 
{ 
	_bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline()) + _bstr_t("\n")+ _bstr_t(pError->Getreason()); 
	::MessageBox(NULL,parseError, "Parse Error",MB_OK); 
} 
 
void CXmlAccess::dump_com_error(_com_error &e) 
{ 
	CString eMsg, msg; 
	eMsg="Error:\n"; 
	msg.Format("\a\tCode = %08lx\n", e.Error()); 
	eMsg+=msg; 
	 
	msg.Format("\a\tCode meaning = %s", e.ErrorMessage()); 
	eMsg+=msg; 
	 
	_bstr_t bstrSource(e.Source()); 
	_bstr_t bstrDescription(e.Description()); 
	 
	msg.Format("\a\tSource = %s\n", (LPCSTR) bstrSource); 
	eMsg+=msg; 
	 
	msg.Format("\a\tDescription = %s\n", (LPCSTR) bstrDescription); 
	eMsg+=msg; 
	 
	::MessageBox(NULL,eMsg, "dump_com_error",MB_OK); 
	 
}