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);
}