How to get Xml as string from XDocument?

C#.NetXmlStringLinq to-Xml

C# Problem Overview


I am new to LINQ to XML. After you have built XDocument, how do you get the OuterXml of it like you did with XmlDocument?

C# Solutions


Solution 1 - C#

You only need to use the overridden ToString() method of the object:

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

This works with all XObjects, like XElement, etc.

Solution 2 - C#

I don't know when this changed, but today (July 2017) when trying the answers out, I got > "System.Xml.XmlDocument"

Instead of ToString(), you can use the originally intended way accessing the XmlDocument content: writing the xml doc to a stream.

XmlDocument xml = ...;
string result;

using (StringWriter writer = new StringWriter())
{
  xml.Save(writer);
  result = writer.ToString();
}

Solution 3 - C#

Doing XDocument.ToString() may not get you the full XML.

In order to get the XML declaration at the start of the XML document as a string, use the XDocument.Save() method:

    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());

Solution 4 - C#

Several responses give a slightly incorrect answer.

  • XDocument.ToString() omits the XML declaration (and, according to @Alex Gordon, may return invalid XML if it contains encoded unusual characters like &).
  • Saving XDocument to StringWriter will cause .NET to emit encoding="utf-16", which you most likely don't want (if you save XML as a string, it's probably because you want to later save it as a file, and de facto standard for saving files is UTF-8 - .NET saves text files as UTF-8 unless specified otherwise).
  • @Wolfgang Grinfeld's answer is heading in the right direction, but it's unnecessarily complex.

Use the following:

  var memory = new MemoryStream();
  xDocument.Save(memory);
  string xmlText = Encoding.UTF8.GetString(memory.ToArray());

This will return XML text with UTF-8 declaration.

Solution 5 - C#

Use ToString() to convert XDocument into a string:

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();

Solution 6 - C#

I found this example in the Microsoft .NET 6 documentation for XDocument.Save method. I think it answers the original question (what is the XDocument equivalent for XmlDocument.OuterXml), and also addresses the concerns that others have pointed out already. By using the XmlWritingSettings you can predictably control the string output.

https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xdocument.save

StringBuilder sb = new StringBuilder();
XmlWriterSettings xws = new XmlWriterSettings();
xws.OmitXmlDeclaration = true;
xws.Indent = true;
 
using (XmlWriter xw = XmlWriter.Create(sb, xws)) {
    XDocument doc = new XDocument(
        new XElement("Child",
            new XElement("GrandChild", "some content")
        )
    );
    doc.Save(xw);
}
Console.WriteLine(sb.ToString());

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAshish GuptaView Question on Stackoverflow
Solution 1 - C#user432219View Answer on Stackoverflow
Solution 2 - C#MafiiView Answer on Stackoverflow
Solution 3 - C#Wolfgang GrinfeldView Answer on Stackoverflow
Solution 4 - C#Mike RosoftView Answer on Stackoverflow
Solution 5 - C#Wilson WuView Answer on Stackoverflow
Solution 6 - C#Daniel KnowltonView Answer on Stackoverflow