Converti XmlDocument in String


218

Ecco come sto attualmente convertendo XMLDocument in String

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

Il problema con questo metodo è che se ho " ((virgolette) che ho negli attributi) li sfugge.

Per esempio:

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

Sopra è l'XML previsto. Ma ritorna

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

Posso fare String.Replace "\" ma quel metodo va bene? Ci sono effetti collaterali? Funzionerà bene se l'XML stesso contiene un "\"

Risposte:


179

Non ci sono citazioni. È solo VS debugger. Prova a stampare sulla console o salvare su un file e vedrai. Come nota a margine: smaltire sempre oggetti usa e getta:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}

2
+1 per correggere il codice per usare i usingblocchi e non XmlTextWriter.
John Saunders,

1
Vale la pena notare (come indicato nelle osservazioni qui: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ) che gli elementi e gli attributi non verranno scritti fino a quando non si chiama il metodo Close di XmlWriter.
Ton

Alcuni di essi potrebbero essere scritti immediatamente. Dipende dal buffering. Indipendentemente da ciò, ho aggiunto una chiamata a Flush, anche se una chiamata Closeo semplicemente la chiusura del xmlTextWriter usingblocco avrebbe fatto lo stesso.
Brian

12
Per rendere grazioso il file XML, passare questo oggetto impostazioni a XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss,

655

Supponendo che xmlDoc sia un oggetto XmlDocument, cosa c'è di sbagliato in xmlDoc.OuterXml?

return xmlDoc.OuterXml;

La proprietà OuterXml restituisce una versione stringa dell'xml .


3
Bene hai ragione. L'ho provato prima, ma quando ho visto le virgolette nel debugger. Ho pensato che fosse a causa di OuterXml e provare quel metodo StringWriter. Ma mi sbagliavo le citazioni erano solo nel debugger. Quindi userò solo OuterXml. Grazie
Akif

Ha funzionato per me! Basta fare un controllo nullo su xmlDoc! restituisce xmlDoc == null? "xmlDoc è null": xmlDoc.OuterXml;
SarjanWebDev,

1
@SarjanWebDev se pensi che il tuo oggetto possa essere nullo, il controllo null va da sé e per ogni risposta qui; e davvero per ogni interazione con un oggetto in C # - personalmente cerco di assicurarmi che gli oggetti siano sempre costruiti in modo da non dover gonfiare il codice con controlli null ovunque ... immagino che dipenda solo dalla tua base di codice .. .
Chris Moutray

10
(y) ma OuterXml non include il tag dichiarativo <? xml version = "1.0" encoding = "utf-16"?>
hazjack

3
@hazjack se si vuole tag dichiarativa poi fare uso della Classe XmlDeclaration msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx~~V~~singular~~3rd - se poi si vuole scrivere in un file quindi quindi utilizzare il metodo di salvataggio FOUND su di te l'istanza XmlDocument msdn.microsoft.com/en-us/library/dw229a22.aspx - per me il tag dichiarativo ha senso solo se stai scrivendo per dire file e non una stringa C #
Chris Moutray,

10

Se si utilizza la Windows.Data.Xml.Dom.XmlDocumentversione di XmlDocument(utilizzata ad esempio nelle app UWP), è possibile utilizzare yourXmlDocument.GetXml()per ottenere l'XML come stringa.


5

Come metodo di estensione:

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;
            }
        }
    }
}

Ora per usare semplicemente:

yourXmlDoc.AsString()

Questo esempio non riesce a chiamare Dispose sui due autori.
Joel Mueller,

2

"viene mostrato come \"nel debugger, ma i dati sono corretti nella stringa e non è necessario sostituire nulla. Prova a scaricare la stringa in un file e noterai che la stringa è corretta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.