web-dev-qa-db-fra.com

Comment changer l'encodage de caractères de XmlReader

J'ai un simple XmlReader:

XmlReader r = XmlReader.Create(fileName);

while (r.Read())
{
    Console.WriteLine(r.Value);
}

Le problème est que le fichier XML contient ISO-8859-9 caractères, ce qui oblige XmlReader à lancer une exception "Invalid character in the given encoding.". Je peux résoudre ce problème en ajoutant la ligne <?xml version="1.0" encoding="ISO-8859-9" ?> au début, mais j'aimerais résoudre le problème autrement si je ne peux pas modifier le fichier source. Comment puis-je changer l'encodage de XmlReader?

21
dstr

Pour forcer .NET à lire le fichier en tant que ISO-8859-9, utilisez simplement l’une des nombreuses surcharges XmlReader.Create, par exemple:.

using(XmlReader r = XmlReader.Create(new StreamReader(fileName, Encoding.GetEncoding("ISO-8859-9")))) {
    while(r.Read()) {
        Console.WriteLine(r.Value);
    }
}

Toutefois, cela risque de ne pas fonctionner car, IIRC, la norme XML du W3C dit quelque chose à propos de la lecture de la ligne de déclaration XML. Un analyseur conforme doit basculer immédiatement sur le codage spécifié dans la déclaration XML, quel que soit le codage qu’il utilisait auparavant. Dans votre cas, si le fichier XML n'a pas de déclaration XML, le codage sera UTF-8 et échouera toujours. Je suis peut-être en train de dire des bêtises, alors essayez et voyez. :-)

35
Christian Hayter

La classe XmlTextReader (qui correspond à ce que la méthode statique Create renvoie, puisque XmlReader est la classe de base abstraite) est conçue pour détecter automatiquement le codage à partir du fichier XML lui-même - il est impossible de le définir manuellement.

Assurez-vous simplement que vous incluez la déclaration XML suivante dans le fichier que vous lisez:

<?xml version="1.0" encoding="ISO-8859-9"?>
4
Noldorin

Si vous ne pouvez pas vous assurer que le fichier d'entrée a le bon en-tête, vous pouvez consulter l'une des 11 autres surcharges de la méthode XmlReader.Create.

Certains d'entre eux prennent une variable XmlReaderSettings ou XmlParserContext, ou les deux. Je n'ai pas enquêté là-dessus, mais il est possible que définir les valeurs appropriées puisse aider ici.

Il y a la propriété XmlReaderSettings.CheckCharacters - l'aide pour ceci indique:

Ordonne au lecteur de vérifier les caractères et de lever une exception si des caractères se trouvent en dehors de la plage de caractères XML légaux. La vérification des caractères inclut la recherche de caractères non autorisés dans le document, ainsi que la vérification de la validité des noms XML (par exemple, un nom XML ne peut pas commencer par un chiffre). 

Donc, régler ceci sur false pourrait aider. Toutefois, l'aide indique également:

Si XmlReader traite des données texte, il vérifie toujours que les noms XML et le contenu du texte sont valides, quel que soit le paramètre de propriété. Définir CheckCharacters sur false désactive la vérification de caractère pour les références d'entité de caractère. 

Donc, une enquête plus poussée est justifiée.

2
ChrisF

Utilisez une XmlTextReader au lieu d'une XmlReader:

System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value))
0
Math