In C#, how do I convert a XmlNode to string, with indentation? (Without looping)

c#, indentation, string, xml, xmlnode

Solution

You were on the right path with the `XMLTextWriter`, you simply need to use a `StringWriter` as the base stream. Here are a few good answers on how this is accomplished. Pay particular attention to the second answer, if your encoding needs to be UTF-8.

Edit:

If you need to do this in multiple places, it is trivial to write an extension method to overload a `ToString()` on `XmlNode`:

public static class MyExtensions
{
    public static string ToString(this System.Xml.XmlNode node, int indentation)
    {
        using (var sw = new System.IO.StringWriter())
        {
            using (var xw = new System.Xml.XmlTextWriter(sw))
            {
                xw.Formatting = System.Xml.Formatting.Indented;
                xw.Indentation = indentation;
                node.WriteContentTo(xw);
            }
            return sw.ToString();
        }
    }
}

Problem

This has got to be such a simple question but I just can't get the answer. I have an XmlNode and all I want to do is output this node, as a string, with indentations (tabs or spaces) intact to provide better readability. So far I tried XmlWriter, XmlTextWriter, XmlDocument, XmlReader. - I tried the PreserveWhitespace in XmlDocument but I couldn't get the XmlDocument to output my node. - I tried the Formatting = Formatting.Indented property in XmlTextWriter but I couldn't figure out how to output the contents to string. To output the XmlNode as string WITHOUT indentation is easy. I just do XmlNode.OuterXml. How do I get the indentations in there? I want to do this without looping through the XmlNode and using brute force to add whitespace, because I think there should be a simpler way. Thanks. Edit: For future readers, here is the answer: ``` var xmlNode = is some object of type XmlNode using (var sw = new StringWriter()) { using (var xw = new XmlTextWriter(sw)) { xw.Formatting = Formatting.Indented; xw.Indentation = 2; //default is 1. I used 2 to make the indents larger. xmlNode.WriteTo(xw); } return sw.ToString(); //The node, as a string, with indents! } ``` The reason I needed to do this was output the node's xml with syntax highlighting. I used AvalonEdit to highlight the xml, outputted the highlighted text to html, then converted the html to a FlowDocument which could be displayed in a RichTextBox.

Original source

Related problems