In C#, what is the best method to format a string as XML? In C#, what is the best method to format a string as XML? xml xml

In C#, what is the best method to format a string as XML?


string unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";string formattedXml = XElement.Parse(unformattedXml).ToString();Console.WriteLine(formattedXml);

Output:

<book>  <author>Lewis, C.S.</author>  <title>The Four Loves</title></book>

The Xml Declaration isn't output by ToString(), but it is by Save() ...

  XElement.Parse(unformattedXml).Save(@"C:\doc.xml");  Console.WriteLine(File.ReadAllText(@"C:\doc.xml"));

Output:

<?xml version="1.0" encoding="utf-8"?><book>  <author>Lewis, C.S.</author>  <title>The Four Loves</title></book>


Unfortunately no, it's not as easy as a FormatXMLForOutput method, this is Microsoft were talking about here ;)

Anyway, as of .NET 2.0, the recommended approach is to use the XMlWriterSettingsClass to set up formatting, as opposed to setting properties directly on the XmlTextWriter object. See this MSDN page for more details. It says:

"In the .NET Framework version 2.0 release, the recommended practice is to create XmlWriter instances using the XmlWriter.Create method and the XmlWriterSettings class. This allows you to take full advantage of all the new features introduced in this release. For more information, see Creating XML Writers. "

Here is an example of the recommended approach:

XmlWriterSettings settings = new XmlWriterSettings();settings.Indent = true;settings.IndentChars = ("    ");using (XmlWriter writer = XmlWriter.Create("books.xml", settings)){    // Write XML data.    writer.WriteStartElement("book");    writer.WriteElementString("price", "19.95");    writer.WriteEndElement();    writer.Flush();}


Using the new System.Xml.Linq namespace (System.Xml.Linq Assembly) you can use the following:

string theString = "<nodeName>blah</nodeName>";XDocument doc = XDocument.Parse(theString);

You can also create a fragment with:

string theString = "<nodeName>blah</nodeName>";XElement element = XElement.Parse(theString);

If the string is not yet XML, you can do something like this:

string theString = "blah";//creates <nodeName>blah</nodeName>XElement element = new XElement(XName.Get("nodeName"), theString); 

Something to note in this last example is that XElement will XML Encode the provided string.

I highly recommend the new XLINQ classes. They are lighter weight, and easier to user that most of the existing XmlDocument-related types.