Исключение из первого шанса в MSXML6

Я проверяю XML-файлы на соответствие схемам XSD, как они делают в документации MSXML пример. У меня есть следующий код:

XMLSchemaValidation updateInfoSchema;
updateInfoSchema.DoInitialization(L"schema.xsd");

HRESULT hr = CoInitialize(NULL);
if(SUCCEEDED(hr))
{
try
{
_bstr_t bstrOutput = updateInfoSchema.validateFile(L"valid.xml");
}
catch(_com_error &e)
{
updateInfoSchema.dump_com_error(e);
}
CoUninitialize();
}// Macro that calls a COM method returning HRESULT value.
#define CHK_HR(stmt)        do { hr=(stmt); if (FAILED(hr)) goto CleanUp; } while(0)_bstr_t XMLSchemaValidation::validateFile(_bstr_t bstrFile)
{
// Declare and initialize variables
MSXML2::IXMLDOMSchemaCollectionPtr   pXS;
MSXML2::IXMLDOMDocument2Ptr          pXD;
MSXML2::IXMLDOMParseErrorPtr         pErr;
_bstr_t bstrResult = L"";
HRESULT hr = S_OK;

// Create a schema cache and add xsd schema to it.
CHK_HR(pXS.CreateInstance(__uuidof(MSXML2::XMLSchemaCache60), NULL, CLSCTX_INPROC_SERVER));
CHK_HR(pXS->add(L"", (LPCSTR)(SchemaFileName.GetString())));

// Create a DOMDocument and set its properties.
CHK_HR(pXD.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER));

// Assign the schema cache to the DOMDocument's schemas collection.
pXD->schemas = pXS.GetInterfacePtr();

// Load bstrFile into the DOM document.
pXD->async = VARIANT_FALSE;
pXD->validateOnParse = VARIANT_TRUE;
pXD->resolveExternals = VARIANT_TRUE;

if(pXD->load(bstrFile) != VARIANT_TRUE)
{
pErr = pXD->parseError;

bstrResult = _bstr_t(L"Validation failed on ") + bstrFile +
_bstr_t(L"\n=====================") +
_bstr_t(L"\nReason: ") + _bstr_t(pErr->Getreason()) +
_bstr_t(L"\nSource: ") + _bstr_t(pErr->GetsrcText()) +
_bstr_t(L"\nLine: ") + _bstr_t(pErr->Getline()) +
_bstr_t(L"\n");
}
else
{
bstrResult = _bstr_t(L"Validation succeeded for ") + bstrFile +
_bstr_t(L"\n======================\n") +
_bstr_t(pXD->xml) + _bstr_t(L"\n");
}

CleanUp:
return bstrResult;
}

XMLSchemaValidation::DoInitialization(CString XSDFileName) получает имя файла схемы XSD в CString XMLSchemaValidation::SchemaFileName,

Затем код следует примеру MSXML, но я получаю

First-chance exception at 0x76f9c41f (KernelBase.dll) in CSW.exe: Microsoft C++ exception: _com_error at memory location 0x04a7f014..

когда код достигает CHK_HR(pXS->add(L"", (LPCSTR)(SchemaFileName.GetString())));, hr имеет -2146697210.

Может кто-нибудь сказать мне, почему это происходит?

1

Решение

MSXML бросает HRESULT OBJECT_NOT_FOUND (0x800C0006), поскольку используемый вами xml не задает набор символов, как подробно описано в этот вопрос. Или MSXML не может найти файл.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]