Konvertieren Sie XmlDocument in String

218

So konvertiere ich derzeit XMLDocument in String

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

Das Problem bei dieser Methode ist, dass wenn ich " ((Anführungszeichen), die ich in Attributen habe) habe, es ihnen entgeht.

Zum Beispiel:

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

Oben ist das erwartete XML. Aber es kehrt zurück

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

Ich kann String.Replace "\" ausführen, aber ist diese Methode in Ordnung? Gibt es irgendwelche Nebenwirkungen? Funktioniert es einwandfrei, wenn das XML selbst ein "\" enthält ?

akif
quelle

Antworten:

179

Es gibt keine Zitate. Es ist nur VS-Debugger. Versuchen Sie, auf der Konsole zu drucken oder in einer Datei zu speichern, und Sie werden sehen. Als Randnotiz: Entsorgen Sie immer Einweggegenstände:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}
Darin Dimitrov
quelle
2
+1 zum Korrigieren des Codes zur Verwendung von usingBlöcken und nicht XmlTextWriter.
John Saunders
1
Beachten Sie (wie in den Anmerkungen hier erwähnt: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ), dass die Elemente und Attribute erst geschrieben werden, wenn Sie die Close-Methode des XmlWriter aufrufen.
TonE
Einige von ihnen können sofort geschrieben werden. Das hängt von der Pufferung ab. Unabhängig davon habe ich einen Aufruf hinzugefügt Flush, obwohl ein Aufruf Closeoder das Schließen des xmlTextWriter usingBlocks dasselbe bewirken würde.
Brian
12
Um die XML-Datei hübsch zu gestalten, übergeben Sie dieses Einstellungsobjekt an XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss
655

Angenommen, xmlDoc ist ein XmlDocument-Objekt. Was ist mit xmlDoc.OuterXml falsch?

return xmlDoc.OuterXml;

Die OuterXml-Eigenschaft gibt eine Zeichenfolgenversion der XML zurück.

Chris Moutray
quelle
3
Nun hast du recht. Ich habe das zuerst versucht, aber als ich die Anführungszeichen im Debugger sah. Ich dachte, es liegt an OuterXml und probiere diese StringWriter-Methode aus. Aber ich habe mich geirrt, die Anführungszeichen waren nur im Debugger. Also benutze ich einfach OuterXml. Danke
akif
Hat für mich gearbeitet! Führen Sie einfach eine Nullprüfung für xmlDoc durch! xmlDoc == null zurückgeben? "xmlDoc ist null": xmlDoc.OuterXml;
SarjanWebDev
1
@SarjanWebDev Wenn Sie glauben, Ihr Objekt könnte null sein, ist die Nullprüfung selbstverständlich und für jede Antwort hier; und wirklich für jede Interaktion mit einem Objekt in C # - persönlich versuche ich sicherzustellen, dass Objekte immer so konstruiert sind, dass ich den Code nicht überall mit Nullprüfungen aufblähen muss ... ich denke, es hängt nur von Ihrer Codebasis ab. .
Chris Moutray
10
(y) aber OuterXml enthält kein deklaratives Tag <? xml version = "1.0" encoding = "utf-16"?>
Hazjack
3
@hazjack Wenn Sie ein deklaratives Tag möchten, verwenden Sie die XmlDeclaration-Klasse msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx. Wenn Sie es dann in eine Datei schreiben möchten, verwenden Sie die gefundene Speichermethode auf Ihrer XmlDocument-Instanz msdn.microsoft.com/en-us/library/dw229a22.aspx - für mich ist das deklarative Tag nur dann sinnvoll, wenn Sie schreiben, um eine Datei und keine C #
-String
10

Wenn Sie eine Windows.Data.Xml.Dom.XmlDocumentVersion von verwenden XmlDocument(die beispielsweise in UWP-Apps verwendet wird), können yourXmlDocument.GetXml()Sie das XML als Zeichenfolge abrufen.

Whyser
quelle
5

Als Erweiterungsmethode:

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

Jetzt einfach zu verwenden:

yourXmlDoc.AsString()
SixOThree
quelle
In diesem Beispiel wird Dispose für die beiden Writer nicht aufgerufen.
Joel Mueller
2

"wird wie \"im Debugger angezeigt , aber die Daten in der Zeichenfolge sind korrekt, und Sie müssen nichts ersetzen. Versuchen Sie, Ihre Zeichenfolge in eine Datei zu kopieren, und Sie werden feststellen, dass die Zeichenfolge korrekt ist.

Arsen Mkrtchyan
quelle