Ошибка при загрузке действительного документа Windows-1252 «Системная ошибка: -2146697210» - PullRequest
3 голосов
/ 03 декабря 2010

Иногда код ниже генерирует ошибку при загрузке действительного XML-файла Windows-1252.

Сбой в Windows XP Professional x86 SP3 с использованием MSXML6.
Успешное выполнение в Windows 7 Ultimate x64 SP1 с использованием MSXML6.

Примечание: приведенный ниже код написан на Delphi, но эквивалентный код также не работает в других средах.

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;

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

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

Я обрезал 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, он также отлично работает в Windows 7 Ultimate x64 SP1).

--jeroen

1 Ответ

6 голосов
/ 05 декабря 2010

Поведение зависит от того, какую версию MSXML6.DLL вы установили.

Чтобы лучше это воспроизвести, я создал еще один файл abnormal.xml, в дополнение к normal.xmlиз вопроса.

Файл дампа 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                             "."/>..

Файл abnormal.xml:

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

Файл дампа 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="."/>..

Файл normal.xml:

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

Я ожидаю, что поведение:

  1. abnormal.xml завершится ошибкой, поскольку не определяет кодировку, но содержитсимвол с установленным старшим битом
  2. normal.xml успешен, так как он содержит однобайтовую кодировку, поддерживающую символы старшего разряда, поэтому символы с установленным старшим битом допускаются

Вот наблюдаемые сценарии:

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 УСПЕХ:

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

Это обзор того, какие версии терпят неудачу.
ИменаDLL между скобками взяты из информации о версии.

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)

Замечания:

Итак: при работе с MSXML6 сначала поставьте галочку, чтоу вас действительно есть последняя версия MSXML6.DLL для вашей целевой версии Windows.

- jeroen

...