2009-05-14 14 views
6

tengo el siguiente código:XmlWriter codificación

MemoryStream ms = new MemoryStream(); 
    XmlWriter w = XmlWriter.Create(ms); 

    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
    w.Close(); 
    ms.Close(); 

    string test = UTF8Encoding.UTF8.GetString(ms.ToArray()); 

El XML es generado correctamente; Sin embargo, mi problema es el primer carácter de la 'prueba' cadena es I (carbón # 239), por lo que es válido para algunos analizadores XML: dónde viene esto? ¿Qué estoy haciendo exactamente de forma incorrecta?

Sé que puedo resolver el problema que acaba de empezar después de que el primer carácter, pero yo prefiero saber por qué está ahí que simplemente parches sobre el problema.

Gracias!

Respuesta

13

encontrado uno solución aquí: http://www.timvw.be/generating-utf-8-with-systemxmlxmlwriter/

me estaba perdiendo esta en la parte superior:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); 
xmlWriterSettings.Encoding = new UTF8Encoding(false); 
MemoryStream ms = new MemoryStream(); 
XmlWriter w = XmlWriter.Create(ms, xmlWriterSettings); 

Gracias por la ayuda de todos!

+2

1 La lista de materiales me llevó de nuevo. Gracias. – bendewey

+0

BOM me consigue cada vez ... el valor predeterminado Encoding.UTF8 incluye la lista de materiales. –

0

Puede cambiar las codificaciones de la siguiente manera:

w.Settings.Encoding = Encoding.UTF8; 
+0

.Settings.Encoding es de sólo lectura; No creo que eso funcione – John

+0

¿Estás seguro? En cuanto a la propiedad de MSDN soporta tanto get/set, pero yo no lo he probado sólo sé que está ahí:/ – Lloyd

+0

Sip. te permite configurarlo; Sin embargo, el resultado será un error de tiempo de ejecución (no error de compilación) – John

2

El problema es que el XML generado por el escritor es UTF 16 mientras usa UTF-8 para convertirlo a cadena. Tal vez puedas probar:

StringBuilder sb = new StringBuilder(); 
using (StringWriter writer = new StringWriter(sb)) 
using (XmlWriter w = XmlWriter.Create(writer)) 
{ 
    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
} 

string test = sb.ToString(); 
+0

La razón de la UTF-8 era conseguir la xmlwriter a la salida de 'encoding = UTF-8' – John

0

Todos estos son un poco fuera, si se preocupan por la marca de orden de bytes, que es algo que los editores de uso (como Visual Studio detectar UTF8 XML codificada y resaltado de sintaxis adecuada).

he aquí una solución:

MemoryStream stream = new MemoryStream(); 

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Encoding = Encoding.UTF8; 
settings.Indent = true; 
settings.IndentChars = "\t"; 

using (XmlWriter writer = XmlWriter.Create(stream, settings)) 
{ 
    // ... write 

    // Make sure you flush or you only get half the text 
    writer.Flush(); 

    // Use a StreamReader to get the byte order correct 
    StreamReader reader = new StreamReader(stream,Encoding.UTF8,true); 
    stream.Seek(0, SeekOrigin.Begin); 
    result = reader.ReadToEnd(); 
} 

Tengo 2 fragmentos en su totalidad here

Cuestiones relacionadas