Ошибка вызова функции ОС при загрузке XML-файла Windows-1252.

Изменить:

Ошибка действительно была в обработке; parseError также терпит неудачу и показывает реальную ошибку; см. дополнительный вопрос для этой ошибки .

Старый вопрос:

Почему-то иногда приведенный ниже код генерирует исключение при загрузке XML с помощью модуля msxml в Delphi XE. Он не работает в Windows XP Professional x86 SP3 с использованием MSXML6 и Windows 7 Ultimate x64 SP1 с использованием MSXML6.

procedure TXMLEOSErrorTestCase.Test;
var
  XmlDocument: IXMLDOMDocument3;
  XmlFileName: string;
begin
  XmlDocument := CoFreeThreadedDOMDocument60.Create();
  XmlFileName :=  TPath.Combine(TPath.GetDirectoryName(ParamStr(0)), '1-Normal.xml');
  if not XmlDocument.load(XmlFileName) then
    RaiseLastOSError();
end;

Эта ошибка возникает во время выполнения метода XmlDocument.load:

EOSError at  $00423B2D
A call to an OS function failed

Я обрезал XML до XML, найденного ниже.

Это шестнадцатеричный дамп файла XML:

000000: 3C 3F 78 6D 6C 20 76 65  72 73 69 6F 6E 20 3D 20 <?xml version =
000010: 22 31 2E 30 22 20 65 6E  63 6F 64 69 6E 67 3D 22 "1.0" encoding="
000020: 57 69 6E 64 6F 77 73 2D  31 32 35 32 22 3F 3E 3C Windows-1252"?><
000030: 52 4F 57 20 43 69 74 79  3D 22 E0 22 2F 3E 0D 0A ROW City="."/>..

Это XML:

<?xml version = "1.0" encoding="Windows-1252"?><ROW City="à"/>

Почему возникает ошибка?

(XML отлично загружается в .NET и других средах, не использующих MSXML6).

--jeroen


person Jeroen Wiert Pluimers    schedule 02.12.2010    source источник
comment
Действительно ли ошибка возникает во время метода load или указанное вами исключение действительно возникает из-за того, что вы вызвали RaiseLastOSError? Подозреваю последнее.   -  person Rob Kennedy    schedule 03.12.2010


Ответы (1)


Как видно из файла SysUtils.pas, это сообщение об ошибке появляется, когда GetLastError возвращает ноль. В документации для IXmlDomDocument.load не рекомендуется звонить GetLastError, чтобы выяснить причину за провал. Значение последней ошибки для вашего потока, вероятно, является нулевым значением по умолчанию.

Вместо этого проверьте значение parseError объекта документа. Он предоставит вам объект IXmlDomParseError, который сообщает вам, где и почему возникла проблема. произошел.

person Rob Kennedy    schedule 03.12.2010
comment
О блестящий; Я перепутал две парадигмы ошибок, даже не заметив этого. Разве это не странная форма слепоты :-) Последует новый вопрос и правильная ошибка (от parseError). - person Jeroen Wiert Pluimers; 03.12.2010