25

这一定是一个如此简单的问题,但我无法得到答案。

我有一个 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 转换为可以显示在 RichTextBox 中的 FlowDocument。

4

2 回答 2

30

您在正确的道路上使用XMLTextWriter,您只需要使用 aStringWriter作为基本流。这里有一些关于如何完成的很好的答案。如果您的编码需要是 UTF-8,请特别注意第二个答案。

编辑:

如果您需要在多个地方执行此操作,编写一个扩展方法来重载 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();
        }
    }
}
于 2011-06-22T15:16:49.363 回答
2

如果您不关心内存或性能,最简单的事情是:

    XElement.Parse(xmlNode.OuterXml).ToString()
于 2019-03-29T22:16:18.837 回答