2010-12-15 5 views
0

Je l'importation de données à partir de fichiers XML contenant ce type de contenu:Correction d'encodage dans un grand Xml fichier

<FirstName>™MšR</FirstName><MiddleName/><LastName>HšNER™Z</LastName>

Le XML est chargé via:

XmlDocument doc = new XmlDocument(); 

try 
{ 
     doc.Load(fullFilePath); 
} 

Lorsque j'exécute cette code avec les données contenues sur le dessus, je reçois une exception à propos d'un caractère illégal. Je comprends parfaitement cette partie.

Je ne suis pas sûr quel codage c'est ou comment résoudre ce problème. Est-ce que je peux changer l'encodage du XmlDocument ou d'une autre méthode pour m'assurer que le contenu ci-dessus est analysé correctement?


Mise à jour: Je n'ai aucune déclaration de codage ou <?xml dans ce document.

J'ai vu des liens dire pour l'ajouter dynamiquement? Est-ce encodage UTF-16?

Répondre

1

De here:

Encoding encoding; 
using (var stream = new MemoryStream(bytes)) 
{ 
    using (var xmlreader = new XmlTextReader(stream)) 
    { 
     xmlreader.MoveToContent(); 
     encoding = xmlreader.Encoding; 
    } 
} 

Vous pouvez jeter un oeil à ceci: How to best detect encoding in XML file?

Pour lecture réelle, vous pouvez utiliser StreamReader pour prendre soin de BOM (byte order mark):

string xml; 

using (var reader = new StreamReader("FilePath", true)) 
{         //   ↑ 
    xml= reader.ReadToEnd();  //  detectEncodingFromByteOrderMarks 
} 

Édition: Suppression du paramètre de codage. StreamReader détectera l'encodage d'un fichier si le fichier contient une nomenclature. Si ce n'est pas le cas, il utilisera par défaut UTF8.

Edit 2: Detecting Text Encoding for StreamReader

0

Il est évident que vous avez fourni un fragment du document XML car il manque un élément racine, donc je suppose que c'était votre intention. Existe-t-il une instruction de traitement XML en haut comme <?xml version="1.0" encoding="UTF-8" ?>?

+0

Non, je n'ai pas ça. – jfar

2

Si vous regardez le fichier avec un éditeur hexadécimal (HXD ou Visual Studio, par exemple), que voyez-vous exactement?

Chaque caractère de la chaîne que vous avez publiée est-il représenté par un seul octet? Le fichier a-t-il une marque d'ordre d'octets (un groupe d'octets non imprimables au début du fichier)?

Le ™ et š semblent indiquer que quelque chose allait très mal avec encodage/conversion le long du chemin, mais nous allons voir ... Je suppose que les deux correspondent à une voyelle (O -M A R ? H- A -NER- O de -Z, peut-être), mais je n'ai pas compris encore comment ils ont fini par ressembler à ça ...

Modifier: dan04 a frappé l'ongle sur la tête. dans cp-1252 a la valeur hexadécimale 99, et š est 9a. Dans cp-437 et cp-850, l'hexagone 99 représente Ö et 9a Ü.

La solution est simple: il suffit de spécifier ce codage lors de l'ouverture de votre fichier XML:

XmlDocument doc = new XmlDocument(); 

using (var reader = new StreamReader(fileName, Encoding.GetEncoding(437))) 
{ 
    doc.Load(reader); 
} 
3

Il semble que:

  • Le nom était ÖMÜR HÜNERÖZ (ou peut-être ÔMÜR HÜNERÔZ ou ÕMÜR HÜNERÕZ, je n » Je ne sais pas quelle langue c'est).
  • Le fichier XML a été codé à l'aide de la page de code DOS "OEM", probablement 437 ou 850.
  • Mais il a été décodé en utilisant windows-1252 (la page de code "ANSI").
+0

Bonne prise! Je n'avais regardé que les pages de code 125x - totalement oublié les DOS ... Je vais ajouter quelques informations à ma réponse. – Arnout

Questions connexes