加载Windows-1252 XML文件时,"对OS功能的调用失败"

Jer*_*ers 1 delphi msxml6 delphi-xe eoserror

编辑:

错误确实在处理中; parseError也失败了,揭示了真正的错误; 请参阅该错误的后续问题.

老问题:

不知何故,有时下面的代码在使用Delphi XE中的msxml单元加载XML时会生成异常.它在使用MSXML6的Windows XP Professional x86 SP3和使用MSXML6的Windows 7 Ultimate x64 SP1上失败.

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;
Run Code Online (Sandbox Code Playgroud)

在XmlDocument.load方法期间发生此错误:

EOSError at  $00423B2D
A call to an OS function failed
Run Code Online (Sandbox Code Playgroud)

我将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="."/>..
Run Code Online (Sandbox Code Playgroud)

这是XML:

<?xml version = "1.0" encoding="Windows-1252"?><ROW City="à"/>
Run Code Online (Sandbox Code Playgroud)

为什么会出现错误?

(XML在.NET和其他不使用MSXML6的环境中完全加载).

--jeroen

Rob*_*edy 6

正如您在SysUtils.pas中看到的那样,该错误消息是GetLastError返回零时给出的错误消息.该文档IXmlDomDocument.load并不建议您致电GetLastError发现失败的原因.线程的最后一个错误值可能是默认的零值.

而是检查文档对象的parseError值.它将为您提供一个IXmlDomParseError对象,告诉您问题发生的位置和原因.