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

本文关键字:字符串 缩进 循环 转换 XmlNode | 更新日期: 2023-09-27 17:59:52

这是一个很简单的问题,但我就是找不到答案。

我有一个XmlNode,我只想把这个节点作为字符串输出,缩进(制表符或空格)保持不变,以提供更好的可读性。

到目前为止,我尝试了XmlWriter、XmlTextWriter、XmlDocument、XmlReader。

  • 我尝试了XmlDocument中的PreserveWhitespace,但无法获得XmlDocument来输出我的节点
  • 我尝试了XmlTextWriter中的Formatting=Formatting.Intated属性,但我不知道如何将内容输出为字符串

将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。

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

如果使用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();
        }
    }
}

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

    XElement.Parse(xmlNode.OuterXml).ToString()