2010-12-03 26 views
3

D'une certaine façon, le code ci-dessous génère parfois une erreur lors du chargement d'un fichier XML Windows-1252 valide.Erreur lors du chargement du document Windows-1252 valide "Erreur système: -2146697210" ​​

Il échoue sur Windows XP Professionnel x86 SP3 en utilisant MSXML6.
Il réussit sur Windows 7 Ultimate x64 SP1 en utilisant MSXML6.

Remarque: le code ci-dessous est écrit en Delphi, mais le code équivalent échoue également dans d'autres environnements.

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; 

Cette erreur se produit au cours de la méthode XmlDocument.Load:

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

Je rognée XML vers le XML trouve ci-dessous.

Ceci est le vidage hexadécimal du fichier 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="."/>.. 

C'est le XML:

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

Pourquoi se produit l'erreur?

(Le XML se charge parfaitement dans .NET et d'autres environnements n'utilisant pas MSXML6, il fonctionne également très bien sur Windows 7 Ultimate x64 SP1).

--jeroen

+0

Les codes d'erreur comme ceux-ci sont plus communément écrits en hexadécimal: ** 800C0006 **.Cela signifie que "le système ne peut pas localiser l'objet spécifié". (C'est la limite de ce que je sais.) L'encodage est-il pertinent pour le problème, je me demande? Que faire si vous spécifiez un encodage différent? Que faire si vous gardez l'encodage que vous avez maintenant, mais utilisez uniquement des caractères ASCII? –

+0

Voilà la chose: c'est une combinaison de ce caractère et de l'encodage. Et cela fonctionne dans Windows 7. Il en va de même pour la version MSXML6. J'étudie les numéros de version maintenant. Résumera quand fini (probablement demain) –

Répondre

5

Le comportement dépend de la version de la MSXML6.DLL vous avez installé.

Pour reproduire cela mieux, j'ai créé un autre fichier abnormal.xml, en plus de la normal.xml de la question.

fichier de vidage 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        "."/>.. 

fichier abnormal.xml:

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

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

fichier normal.xml:

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

Le comportement que je pense est que:

  1. abnormal.xml échoue, car il ne spécifie pas un codage, mais contient un caractère avec le haut bit mis
  2. normal.xml réussit, comme il conains un encodage -Byte supportant les caractères étendus, donc des personnages avec jeu haut bits sont autorisés

Ce sont les scénarios observés:

MSXML6 PANNE:

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 RÉUSSITE:

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 

Voici un aperçu de ce que les versions ne.
Les noms des DLL entre parenthèses proviennent de leurs informations de version.

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:

Ainsi: lorsque vous faites MSXML6 travail, d'abord mettre un chèque que vous avez bien la dernière MSXML6.D LL pour votre version Windows cible.

--jeroen