Convertir XmlDocument en String

218

Así es como actualmente estoy convirtiendo XMLDocument a String

StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

El problema con este método es que si tengo " ((comillas) que tengo en los atributos) se les escapa.

Por ejemplo:

<Campaign name="ABC">
</Campaign>

Arriba está el XML esperado. Pero vuelve

<Campaign name=\"ABC\">
</Campaign>

Puedo hacer String.Replace "\" pero ¿está bien ese método? ¿Hay algún efecto secundario? ¿Funcionará bien si el propio XML contiene un "\"

akif
fuente

Respuestas:

179

No hay citas. Es solo VS depurador. Intente imprimir en la consola o guardar en un archivo y verá. Como nota al margen: siempre deseche los objetos desechables:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}
Darin Dimitrov
fuente
2
+1 para arreglar el código para usar usingbloques y no XmlTextWriter.
John Saunders
1
Vale la pena señalar (como se menciona en los comentarios aquí: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ) que los elementos y atributos no se escribirán hasta que llame al método Close de XmlWriter.
TonE
Algunos de ellos pueden escribirse de inmediato. Depende del almacenamiento en búfer. De todos modos, agregué una llamada a Flush, aunque una llamada Closeao simplemente cerrando el xmlTextWriter usingbloque lograría lo mismo.
Brian
12
Para hacer el xml bonito, pase este objeto de configuración a XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss
655

Suponiendo que xmlDoc es un objeto XmlDocument, ¿qué tiene de malo xmlDoc.OuterXml?

return xmlDoc.OuterXml;

La propiedad OuterXml devuelve una versión de cadena del xml.

Chris Moutray
fuente
3
Pues tienes razon. Lo intenté primero pero cuando vi las citas en el depurador. Pensé que era por OuterXml y probar ese método StringWriter. Pero me equivoqué, las citas solo estaban en el depurador. Así que solo usaré OuterXml. Gracias
akif
¡Trabajó para mi! ¡Simplemente haga una comprobación nula en xmlDoc! return xmlDoc == nulo? "xmlDoc es nulo": xmlDoc.OuterXml;
SarjanWebDev
1
@SarjanWebDev si cree que su objeto podría ser nulo, entonces la comprobación nula no tiene sentido y para cada respuesta aquí; y realmente para cada interacción con un objeto en C # - personalmente trato de asegurarme de que los objetos siempre se construyan para que no tenga que hinchar el código con comprobaciones nulas en todas partes ... supongo que solo depende de su base de código ... .
Chris Moutray
10
(y) pero OuterXml no incluye la etiqueta declarativa <? xml version = "1.0" encoding = "utf-16"?>
hazjack
3
@hazjack si desea una etiqueta declarativa, utilice la clase de declaración Xml msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx : si desea escribirla en el archivo, utilice el método de guardar encontrado en su instancia de XmlDocument msdn.microsoft.com/en-us/library/dw229a22.aspx : para mí, la etiqueta declarativa solo tiene sentido si está escribiendo para decir un archivo y no una cadena de C #
Chris Moutray
10

Si está utilizando la Windows.Data.Xml.Dom.XmlDocumentversión de XmlDocument(utilizada en aplicaciones para UWP, por ejemplo), puede utilizarla yourXmlDocument.GetXml()para obtener el XML como una cadena.

Whyser
fuente
5

Como un método de extensión:

public static class Extensions
{
    public static string AsString(this XmlDocument xmlDoc)
    {
        using (StringWriter sw = new StringWriter())
        {
            using (XmlTextWriter tx = new XmlTextWriter(sw))
            {
                xmlDoc.WriteTo(tx);
                string strXmlText = sw.ToString();
                return strXmlText;
            }
        }
    }
}

Ahora para usar simplemente:

yourXmlDoc.AsString()
SixOThree
fuente
Este ejemplo no puede llamar a Dispose en los dos escritores.
Joel Mueller
2

"se muestra como \"en el depurador, pero los datos son correctos en la cadena y no necesita reemplazar nada. Intente volcar su cadena en un archivo y notará que la cadena es correcta.

Arsen Mkrtchyan
fuente