在C#中,如何将XmlNode转换为带缩进的字符串?(不使用循环)

27
这看起来是一个非常简单的问题,但我就是无法得到答案。
我有一个XmlNode,我想做的就是输出这个节点作为一个字符串,并保留缩进(制表符或空格)以提供更好的可读性。
到目前为止,我尝试了XmlWriter、XmlTextWriter、XmlDocument和XmlReader。
我尝试过在XmlDocument中使用PreserveWhitespace,但无法让XmlDocument输出我的节点。
我在XmlTextWriter中试过Formatting = Formatting.Indented属性,但我无法弄清如何将内容输出为字符串。
输出不带缩进的XmlNode很容易。我只需使用XmlNode.OuterXml。但如何在其中添加缩进呢?
我想做到这一点,而不必遍历XmlNode并使用暴力方法添加空格,因为我认为应该有更简单的方法。
谢谢。
编辑:对于未来的读者,在这里是答案:
  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!
  }

我需要这样做的原因是希望输出带有语法高亮的节点xml。我使用了AvalonEdit来对xml进行高亮处理,将高亮文本输出为html,然后将html转换为FlowDocument,以便在RichTextBox中显示。

2个回答

34
你的思路是正确的,可以使用 XMLTextWriter,只需将 StringWriter 作为基本流。这里有一些关于如何实现这一点的好答案。特别注意第二个答案,如果你需要使用 UTF-8 编码。
编辑:
如果你需要在多个地方这样做,可以很容易地编写一个扩展方法,重载 XmlNode 上的 ToString()
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();
        }
    }
}

谢谢提供链接!它可用。我想我只是在搜索错误的东西。我一直卡在尝试让节点输出,然而我真正需要的是将编写器输出到字符串。谢谢,我会用答案更新我的问题。 - Yuf
是的,这是面向对象编程的一个缺陷,有时您必须将对象包装在其他对象中以获得功能。值得庆幸的是,C#为我们提供了许多方法来将一些函数式编程融入其中,包括扩展方法。如果您发现自己需要经常这样做,请考虑制作一个像我更新后答案中的那样的扩展方法。 - drharris
这对我没有起作用 - 除非我将其命名为ToString()之外的其他名称(例如ToIndentedString()),否则将调用标准的object.ToString()。 - Dave
@Dave,只要你将整数参数传递给ToString()方法,它就可以正常工作。如果你在没有参数的情况下调用它,它将默认使用原始方法。这是一种重载,而不是覆盖。 - drharris

4
如果您不关心内存或性能,最简单的方法是:
    XElement.Parse(xmlNode.OuterXml).ToString()

优雅简洁,特别适用于脚本编写,例如使用PowerShell 7+:[System.Xml.Linq.XElement]::Parse($xmlNode.OuterXml).ToString() - zett42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接