2009-06-15 11 views
0

J'essaie de lire un flux XML et de le charger dans une collection.Problèmes lors de la lecture de la section CDATA avec des caractères spéciaux (codage ISO-8859-1)

Cela fonctionne mais j'ai de la difficulté à lire des caractères spéciaux.

E.g. si mon xml ressemble à ceci

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<persons> 
<person> 
<firstname> 
<![CDATA[ Sébastien ]]> 
    </firstname> 
    <lastname> 
    <![CDATA[Ørvåk]]> 
    </lastname> 
</person> 
</persons> 

j'essaie de lire les valeurs en utilisant LINQ comme

var persons = from p in doc.Elements("persons").Elements("person") select p; 
string firstname = person.Element("firstname").Value; 
string lastname = person.Element("lastname").Value; 

mais Ørvåk Ø et å/Sébastien l'é donne les caractères étranges.

Est-ce que quelqu'un sait ce qui ne va pas? Je suppose qu'il n'utilise pas l'encodage ISO-8859-1.

Merci

+1

Comment avez-vous obtenu le fichier XML dans le document? – lavinio

+0

Pouvez-vous être plus précis sur les "personnages étranges" que vous voyez? Comment inspectez-vous les valeurs de vos variables au moment de l'exécution? –

Répondre

1

Il est possible que le fichier n'est pas dans la norme ISO-8859-1, mais est en UTF-8. Pouvez-vous fournir un vidage hexadécimal du contenu? Parfois, l'auteur d'un fichier XML ne fait pas attention à la chaîne d'encodage.

En outre, il se peut que le document XML provienne de HTTP et que les en-têtes HTTP déclarent incorrectement le codage. Section 4.3.3 dans le XML specification indique que les règles MIME remplacent ce que le document lui-même indique.

Si vous pointez votre propre code au lien au lieu de votre copie locale, cela pourrait signifier votre serveur web local n'est pas configuré correctement ...

0

Le fichier XML que vous avez mentionné dans votre suivi est parfaitement correct. Donc, votre bug est spécifique à votre code Javascript.

+0

Code Javascript? Que voulez-vous dire? Je n'ai pas et js code? –

+0

OK, vous avez détecté mon manque de familiarité avec Javascript. Alors qu'est-ce que c'est? C#? Vous n'avez pas tagué la question avec la langue que vous utilisez. – bortzmeyer

3

développiez une personne de réponse autre a donné:

Il y a deux possibilités:

  1. Le fichier est vraiment codé comme UTF-8, mais est interprété par votre analyseur XML comme ISO-8859-1.
  2. Le fichier est réellement codé ISO-8859-1 mais est interprété par votre analyseur XML comme UTF-8.

Pour déterminer lequel est qui, regardez ce qui se passe avec le é dans Sébastien. Il y a deux possibilités que je peux imaginer:

  1. « é » devient deux personnages différents - probablement « é »
  2. « é » devient un carac simple non-sens ou « ? », et peut-être le « b » est également manquant au nom Sébastien.

Dans le premier cas, votre fichier n'est pas ce que vous pensez qu'il est. (Il arrive à votre programme en tant que données UTF-8, mais votre programme essaie de l'interpréter comme ISO-8859-1) Regardez le fichier xml avec un éditeur hexadécimal ou autre chose qui peut vous montrer quels sont les octets sur le disque.

Dans le second cas, je vérifierais comment le serveur HTTP sur localhost sert ce fichier. (Votre programme devient octets en format ISO-8859-1, mais les interprète comme UTF-8) La meilleure façon de le faire sur les fenêtres est d'ouvrir une invite cmd et exécutez la commande: telnet localhost 80

Quand cela ouvre une fenêtre, tapez la ligne suivante (ou copier-coller depuis stackoverflow) et appuyez deux fois sur Entrée. Attention: Vous ne serez pas en mesure de voir ce que vous tapez, et la capitalisation est importante.

GET /Test/person.xml HTTP/1.0 

Dans la réponse, recherchez une ligne commençant par Content-Type. Cela vous indiquera comment le serveur web local sert le fichier.

Mise à jour: Après avoir examiné votre dossier, il est vraiment iso-8859-1, donc ce que je suggère est définissant l'attribut .Encoding de votre Webclient par exemple comme si avant de dire à télécharger le fichier:

client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1") 

Sinon, vous pouvez utiliser les méthodes DownloadBytes au lieu des méthodes DownloadString, puis analyser les octets dans un fichier xml. Le problème est actuellement que lorsque l'analyseur xml obtient le contenu du fichier, les octets ont déjà été interprétés comme une chaîne, il est donc trop tard pour changer le codage.