"Ошибка вызова функции ОС" при загрузке 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
1 ответ
Как вы можете видеть в SysUtils.pas, это сообщение об ошибке появляется, когда GetLastError
возвращает ноль. Документация для IXmlDomDocument.load
не советует вам звонить GetLastError
выяснить причину неудачи. Значение последней ошибки для вашего потока, вероятно, является нулевым значением по умолчанию.
Вместо этого проверьте объект документа parseError
значение. Это даст вам IXmlDomParseError
Объект, который говорит вам, где и почему возникла проблема.