Я пытаюсь отладить то, что, кажется, XML, анализирующий проблему в моем коде. Я изолировал его вниз к следующему фрагменту кода:
HRESULT
CXmlDocument::Load(IStream* Stream)
{
CComVariant xmlSource(static_cast(Stream));
VARIANT_BOOL isSuccessful;
* HRESULT hr = m_pXmlDoc->load(xmlSource, &isSuccessful);
return (hr == S_FALSE) ? E_FAIL : hr;
}
Примечание: m_pXmlDoc
имеет тип CComPtr
.
Кажется что вызов к IXMLDOMDocument::load()
(отмеченный с *), перестал работать - IOW, он возвращается S_FALSE
.
Я не могу ступить в load()
определить, почему это перестало работать, поскольку это - вызов COM.
Страница MSDN для этого метода, кажется, не дает большое понимание.
У меня есть несколько догадок:
Какие-либо идеи относительно того, почему этот вызов мог перестать работать?
Следующий код будет получать определенную ошибку анализатора с DOM и ее местоположения в источнике XML.
CComPtr<IXMLDOMParseError> pError;
CComBSTR sReason, sSource;
long nLine = 0, nColumn = 0;
m_pXmlDoc->get_parseError(&pError);
if(pError)
{
pError->get_reason(&sReason);
pError->get_srcText(&sSource);
pError->get_line(&nLine);
pError->get_linepos(&nColumn);
}
Срезон
будет заполнен сообщением об ошибке. Ssource
будет содержать ошибочную линию источника в XML. NLINE
и ncolumn
должен быть установлен на номер линии и столбец ошибки, хотя на практике эти два не всегда установлены надежно (IIRC, это особенно верно для ошибок валидации, а не парсер / хорошо сформированы).