Ошибка при загрузке действительного документа Windows-1252 "Системная ошибка: -2146697210"
Почему-то иногда код ниже генерирует ошибку при загрузке действительного 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 ответ
Поведение зависит от того, какая версия 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="à"/>
Я ожидаю, что поведение:
abnormal.xml
терпит неудачу, потому что это не определяет кодировку, но содержит символ с установленным старшим битом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)
Замечания:
- Автоматическое обновление Windows и Microsoft Update не обновят MSXML6.DLL до последней версии в Windows XP SP3.
- MSXML6 SP3 для Windows XP отсутствует.
- Последняя версия фактически 6.20.2003.0 для Windows XP SP2 и может быть получена по адресу http://support.microsoft.com/kb/973686 (она не устанавливается в Windows XP SP3).
- Версию MSXML6.DLL для Windows XP с пакетом обновления 3 ( SP3) 6.20.1103.0 можно получить по адресу http://support.microsoft.com/kb/973687 ( прямая загрузка для XP с пакетом обновления 3).
- У Microsoft очень мало информации на их сайте об этом: http://www.google.com/search?q=msxml6+%226.20.1099.0%22+%226.20.1103.0%22+site:microsoft.com
- Поиск только по 6.20.1103.0 не показывает намного больше: http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=msxml6+%226.20.1103.0%22+site:microsoft.com
- Это дает лучшие результаты поиска: http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=msxml6+%226.20.1103.0%22
Итак: при работе с MSXML6 сначала проверьте, действительно ли у вас установлена последняя версия MSXML6.DLL для целевой версии Windows.
--jeroen