3
votes

Somehow, sometimes the code below generates an error when loading valid Windows-1252 XML.

It fails on Windows XP Professional x86 SP3 using MSXML6.
It succeeds on Windows 7 Ultimate x64 SP1 using MSXML6.

Note: the code below is written in Delphi, but equivalent code also fails in other environments.

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
    Parse(XmlDocument.parseError);
end;

This error occurs during the XmlDocument.load method:

reason: System error: -2146697210.
errorCode: -2146697210
url: C:\temp\1-Normal.xml

I trimmed the XML down to the XML found below.

This is the hex dump of the XML file:

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="."/>..

This is the XML:

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

Why does the error occur?

(The XML loads perfectly fine in .NET and other environments not using MSXML6, it also works fine on Windows 7 Ultimate x64 SP1).

--jeroen

1
Error codes like that are more commonly written in hexadecimal: 800C0006. That means "the system cannot locate the object specified." (That's the limit of what I know.) Is the encoding relevant to the problem at all, I wonder? What if you specify a different encoding? What if you keep the encoding you have now, but use only ASCII characters?Rob Kennedy
That is the thing: it is a combination of that character and the encoding. And it works in Windows 7. So it has to do with the MSXML6 version too. I'm investigating version numbers now. Will summarize when done (probably tomorrow)Jeroen Wiert Pluimers

1 Answers

6
votes

The behaviour depends on which version of the MSXML6.DLL you have installed.

To reproduce this better, I created another file abnormal.xml, in addition to the normal.xml from the question.

File dump abnormal.xml:

000000: 3C 3F 78 6D 6C 20 76 65  72 73 69 6F 6E 3D 22 31 <?xml version="1
000010: 2E 30 22 20 73 74 61 6E  64 61 6C 6F 6E 65 3D 22 .0" standalone="
000020: 79 65 73 22 3F 3E 3C 52  4F 57 20 43 69 74 79 3D yes"?><ROW City=
000030: 22 E0 22 2F 3E 0D 0A                             "."/>..

File abnormal.xml:

<?xml version="1.0" standalone="yes"?><ROW City="à"/>

File dump normal.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="."/>..

File normal.xml:

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

The behaviour I expect is that:

  1. abnormal.xml fails, because it does not specify an encoding, but contains a character with the high-bit set
  2. normal.xml succeeds, as it conains a single-byte encoding supporting high-bit characters, so characters with high-bit set are allowed

These are the observed scenarios:

MSXML6 FAILURE:

reason: System error: -2146697210.
errorCode: -2146697210
url: file:///C:/My%20Dropbox/XMLEOSErrorTest/Abnormal.xml

reason: System error: -2146697210.
errorCode: -2146697210
url: file:///C:/My%20Dropbox/XMLEOSErrorTest/Normal.xml

MSXML6 SUCCESS:

reason: An invalid character was found in text content.

errorCode: -1072896760
url: file:///C:/My%20Dropbox/XMLEOSErrorTest/Abnormal.xml
srcText: <?xml version="1.0" standalone="yes"?><ROW City="
line: 1
linepos: 50
filepos: 49

This is an overview of what versions fail.
The names of the DLL's between parentheses are from their version information.

failure; XP Professional SP3:
msxml6.dll       version 6.20.1099.0  (MSXML 6.0 SP2)
msxml6r.dll      version 6.0.3883.0   (XML Resources)

success; Windows 7 Ultimate x64 SP1:
msxml6.dll       version 6.30.7600.16385  (MSXML 6.0 SP3)
msxml6r.dll      version 6.30.7600.16385
msxml6r.dll.mui  version 6.30.7600.16385

success; XP Professional SP3:
msxml6.dll       version 6.20.1103.0  (MSXML 6.0 SP3)
msxml6r.dll      version 6.0.3883.0   (XML Resources)

Observations:

So: when doing MSXML6 work, first put in a check that you indeed have the latest MSXML6.DLL for your target Windows version.

--jeroen