Как определить причину сбоя при вызове IXMLDOMDocument :: load ()? - PullRequest
5 голосов
/ 27 января 2010

Я пытаюсь отладить, как представляется, проблему синтаксического анализа XML в моем коде. Я выделил его следующим фрагментом кода:

HRESULT
CXmlDocument::Load(IStream* Stream)
{
    CComVariant xmlSource(static_cast<IUnknown*>(Stream));
    VARIANT_BOOL isSuccessful;
  * HRESULT hr = m_pXmlDoc->load(xmlSource, &isSuccessful);
    return (hr == S_FALSE) ? E_FAIL : hr;
}

Примечание: m_pXmlDoc относится к типу CComPtr<IXMLDOMDocument>.

Похоже, что вызов IXMLDOMDocument::load() (помеченный *) не выполняется - IOW, он возвращает S_FALSE.

Я не могу войти в load(), чтобы определить причину сбоя, так как это вызов COM.

Страница MSDN для этого метода, по-видимому, не дает большого понимания.

У меня есть несколько догадок:

  • XML неправильно сформирован
  • Файл XML слишком велик (приблизительно 120 МБ)
  • Это проблема, связанная с памятью (размер процесса достигает> 2 ГБ во время сбоя)
    • NB: Установлен раздел реестра, чтобы размер процесса был таким большим, поскольку наибольший допустимый размер процесса для WinXP, AFAIK, составляет 2 ГБ).

Есть идеи, почему этот звонок может быть неудачным?

Ответы [ 2 ]

10 голосов
/ 27 января 2010

Следующий код извлечет конкретную ошибку синтаксического анализатора из 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);
}

sReason будет заполнено сообщением об ошибке. sSource будет содержать ошибочную исходную строку в XML. nLine и nColumn должны быть установлены на номер строки и столбец ошибки, хотя на практике эти два значения не всегда устанавливаются надежно (iirc, это особенно верно для ошибок валидации, а не ошибок синтаксического анализа / правильного формирования ).

0 голосов
/ 24 сентября 2010

Если файл XML открывается другой задачей или обрабатывает метод Load () не могу загрузить файл, но в нем не указано, что загрузка не удалась. Я считаю это поведение ошибкой.

Таким образом, вы должны проверить свойство documentElement - если оно равно null, то load () тоже не удалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...