2009-06-07 28 views
20

Tengo un XmlReader simple:Cómo cambiar la codificación de caracteres de XmlReader

XmlReader r = XmlReader.Create(fileName); 

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

El problema es que el archivo XML tiene ISO-8859-9 personajes en él, lo que hace un tiro XmlReader "Invalid character in the given encoding." excepción. Puedo resolver este problema agregando la línea <?xml version="1.0" encoding="ISO-8859-9" ?> al principio, pero me gustaría resolver esto de otra manera en caso de que no pueda modificar el archivo fuente. ¿Cómo puedo cambiar la codificación de XmlReader?

Respuesta

33

Para obligar a .NET a leer el archivo como ISO-8859-9, solo use una de las muchas sobrecargas XmlReader.Create, p.

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

Sin embargo, esto puede no funcionar debido a que, IIRC, el estándar W3C XML dice algo acerca de cuando la línea de declaración XML ha sido leído, un analizador compatible debe cambiar inmediatamente a la codificación especificada en la declaración XML, independientemente de lo codificación que estaba usando antes. En su caso, si el archivo XML no tiene declaración XML, la codificación será UTF-8 y seguirá fallando. Puede que esté diciendo tonterías aquí, así que pruébalo y mira. :-)

+0

Sí, no creo que solo cambiar la codificación del StreamReader funcionará ... – Noldorin

+1

Lo intenté, esto funcionó. ¡Gracias! – dstr

+1

Tenga cuidado, el lector de secuencias no se cierra después del final de la instrucción 'using' cuando se usa una sintaxis como esta. La forma segura sería: 'using (StreamReader sr = new StreamReader (fileName, Encoding.GetEncoding (" ISO-8859-9 "))) usando (XmlReader r = XmlReader.Create (sr)) {...}' –

3

El XmlTextReader clase (que es lo que el Create método estático se vuelve realidad, ya que XmlReader es la clase base abstracta) está diseñado para detectar automáticamente la codificación del archivo XML en sí - no hay manera de establecer de forma manual.

Simplemente asegurar que se incluye la siguiente declaración XML en el archivo que está leyendo:

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

Si no puede garantizar que el archivo de entrada tiene la cabecera de la derecha, usted podría mirar a una de la otra 11 sobrecargas al método XmlReader.Create.

Algunos de estos toman una variable XmlReaderSettings o XmlParserContext variable, o ambos. No he investigado estos, pero existe la posibilidad de que establecer los valores apropiados pueda ayudar aquí.

No es la propiedad XmlReaderSettings.CheckCharacters - la ayuda para este afirma:

Encarga al lector para comprobar personajes y lanzar una excepción si los caracteres están fuera del rango de caracteres XML legales. La comprobación de caracteres incluye la comprobación de caracteres ilegales en el documento, así como la comprobación de la validez de los nombres XML (por ejemplo, un nombre XML puede no comenzar con un número).

Configurando esto en false podría ayudar. Sin embargo, la ayuda también indica:

Si XmlReader está procesando datos de texto, siempre verifica que los nombres XML y el contenido de texto sean válidos, independientemente de la configuración de la propiedad. Establecer CheckCharacters en falso desactiva la comprobación de caracteres para las referencias de entidades de caracteres.

Por lo tanto, se justifican investigaciones adicionales.

+0

encontré CheckCharacters demasiado pero no ayudó, al menos en mi caso .. – dstr

0

Utilice un XmlTextReader en lugar de un XmlReader:

System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value)) 
Cuestiones relacionadas