Wie bekomme ich XML als Zeichenfolge von XDocument?

73

Ich bin neu in LINQ to XML. XDocumentWie bekommen Sie das , nachdem Sie gebaut haben , OuterXmlso wie Sie es gemacht haben XmlDocument?

Ashish Gupta
quelle

Antworten:

98

Sie müssen nur die überschriebene ToString () -Methode des Objekts verwenden:

XDocument xmlDoc ...
string xml = xmlDoc.ToString();

Dies funktioniert mit allen XObjects wie XElement usw.

Hoppe
quelle
23
Wofür um alles in der Welt ist diese Methode? o.0
Andrzej Gis
1
Es ist nur eine einfache Demonstration, einen einfachen Link zur XmlDocument.OuterXml-Eigenschaft zu haben.
4
Dies kehrt jetzt zurückSystem.Xml.XmlDocument
The Muffin Man
4
@ TheMuffinMan Dann machst du es falsch, da diese Antwort über XDocument ist, nicht XmlDocument (Linq)
Mathijs Segers
Wenn eines Ihrer XML- &Zeichen oder andere Sonderzeichen enthält, funktioniert dies nicht
Alex Gordon
10

Ich weiß nicht, wann sich das geändert hat, aber heute (Juli 2017) habe ich beim Ausprobieren die Antworten bekommen

"System.Xml.XmlDocument"

Stattdessen ToString()können Sie die ursprünglich vorgesehene Art des Zugriffs auf den XmlDocumentInhalt verwenden: Schreiben des XML-Dokuments in einen Stream.

XmlDocument xml = ...;
string result;

using (StringWriter writer = new StringWriter())
{
  xml.Save(writer);
  result = writer.ToString();
}
Mafii
quelle
6
Natürlich ist es verwirrend, aber wenn Sie mit Linq arbeiten, sollten Sie XDocument verwenden, nicht XmlDocument. Dann sollte es funktionieren :-).
Mathijs Segers
4

Wenn Sie XDocument.ToString () ausführen, erhalten Sie möglicherweise nicht das vollständige XML.

Verwenden Sie die Methode XDocument.Save (), um die XML-Deklaration am Anfang des XML-Dokuments als Zeichenfolge abzurufen:

    var ms = new MemoryStream();
    using (var xw = XmlWriter.Create(new StreamWriter(ms, Encoding.GetEncoding("ISO-8859-1"))))
        new XDocument(new XElement("Root", new XElement("Leaf", "data"))).Save(xw);
    var myXml = Encoding.GetEncoding("ISO-8859-1").GetString(ms.ToArray());
Wolfgang Grinfeld
quelle
Diese Komplexität wird kaum benötigt und immer wieder kopiert. Verwenden Sie einfach ein StringWriter()zu Save()direkt.
Gábor
2

Verwenden Sie ToString (), um XDocument in eine Zeichenfolge zu konvertieren:

string result = string.Empty;
XElement root = new XElement("xml",
    new XElement("MsgType", "<![CDATA[" + "text" + "]]>"),
    new XElement("Content", "<![CDATA[" + "Hi, this is Wilson Wu Testing for you! You can ask any question but no answer can be replied...." + "]]>"),
    new XElement("FuncFlag", 0)
);
result = root.ToString();
Wilson Wu
quelle