La fuerza XDocument para escribir en Cadena con codificación UTF-8

Quiero ser capaz de escribir XML a una Cadena de caracteres con la declaración y con la codificación UTF-8. Esto parece poderoso difícil de lograr.

He leído de todo un poco y trató de algunas de las respuestas populares para esto, pero a la que todos tienen problemas. Mi actual código correctamente los productos como UTF-8, pero no mantiene el formato original de la XDocument (es decir, guiones /espacio en blanco)!

Nadie ofrece algunos consejos por favor?

XDocument xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), xelementXML);

MemoryStream ms = new MemoryStream();
using (XmlWriter xw = new XmlTextWriter(ms, Encoding.UTF8))
{
    xml.Save(xw);
    xw.Flush();

    StreamReader sr = new StreamReader(ms);
    ms.Seek(0, SeekOrigin.Begin);

    String xmlString = sr.ReadToEnd();
}

El XML requiere el formato para que sea idéntica a la forma en .ToString() sería formato es decir,

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
    <node>blah</node>
</root>

Lo que estoy viendo actualmente es

<?xml version="1.0" encoding="utf-8" standalone="yes"?><root><node>blah</node></root>

Actualización
Me las he arreglado para conseguir que esto funcione mediante la adición de XmlTextWriter configuración… parece MUY torpe, aunque!

MemoryStream ms = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.Indent = true;
using (XmlWriter xw = XmlTextWriter.Create(ms, settings))
{
    xml.Save(xw);
    xw.Flush();

    StreamReader sr = new StreamReader(ms);
    ms.Seek(0, SeekOrigin.Begin);
    String blah = sr.ReadToEnd();
}
  • Lo ‘formato’? Usted no ha dicho nada sobre el formato!
  • El habitual espacio en blanco / formato que se obtiene si se acaba de una .ToString() en un XDocument o XElement
  • Por favor, dar un ejemplo de documento de entrada para que podamos probar las respuestas.
  • Hecho… es sólo el espacio en blanco de formato estoy preocupado acerca de como más tarde me hash el XML, por lo que necesitan para estar 100% seguro de que el resultado es coherente.
  • Me ha proporcionado una manera más simple de hacerlo.
  • Título y aprobado respuesta sugieren que esto se acerca UTF-8 frente a UTF-16, pero su propia solución muestra es sobre el formato de / pretty-printing lugar. En lugar de la configuración, se puede simplemente hacer xw.Formatting=Formatting.Indented .
  • Una amenaza es Cómo imprimir <?xml version=“1.0”?> utilizando XDocument.

InformationsquelleAutor Chris | 2010-10-06

3 Kommentare

  1. 62

    Intente esto:

    using System;
    using System.IO;
    using System.Text;
    using System.Xml.Linq;
    
    class Test
    {
        static void Main()
        {
            XDocument doc = XDocument.Load("test.xml",
                                           LoadOptions.PreserveWhitespace);
            doc.Declaration = new XDeclaration("1.0", "utf-8", null);
            StringWriter writer = new Utf8StringWriter();
            doc.Save(writer, SaveOptions.None);
            Console.WriteLine(writer);
        }
    
        private class Utf8StringWriter : StringWriter
        {
            public override Encoding Encoding { get { return Encoding.UTF8; } }
        }
    }

    De curso, aún no nos han mostrado cómo se está construyendo el documento, lo que dificulta la prueba… he intentado con una mano-construido XDocument y que contiene el correspondiente espacio en blanco también.

    • Funciona de maravilla, gracias – no hay manera de conseguir la codificación ordenada sin la herencia de StringWriter?
    • Es es posible que hay alguna manera de conseguir el TextWriter sobrecarga de ignorar la codificación que el TextWriter anuncia, pero he encontrado que esto es realmente un sencillo truco para conseguir el trabajo hecho. (Sólo lo necesitas en un solo lugar…)
    • Sí, me gusta – es MUCHO mejor que el método que se me ocurrió. Gracias
  2. 1

    Intentar XmlWriterSettings:

    XmlWriterSettings xws = new XmlWriterSettings();
    xws.OmitXmlDeclaration = false;
    xws.Indent = true;

    Y la pase como

    using (XmlWriter xw = XmlWriter.Create(sb, xws))

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein