带缩进和xml:space="preserve"保存XDocument

5
我希望能够格式化一个XDocument,但是保留xml:space="preserve"元素中的空格不变。
这段代码:
new XDocument(
    new XElement("a",
        new XElement("b",
            new XElement("c"))))
    .Save(Console.Out);

以下是我想要的缩进输出结果:
<a>
  <b>
    <c />
  </b>
</a>

然而,假设我需要保留元素内的空白:
new XDocument(
    new XElement("a",
        new XElement("b",
            new XAttribute(XNamespace.Xml + "space", "preserve"),
            new XElement("c"))))
    .Save(Console.Out);

在这种情况下,我会得到以下输出:
<a>
  <b xml:space="preserve">
    <c />
  </b>
</a>

这不太好,因为缩进是在xml:space="preserve"范围内添加的。预期输出应该是:

<a>
  <b xml:space="preserve"><c /></b>
</a>

我很惊讶XDocument默认不支持此功能。

是否可能从XDocument获得漂亮的格式化(缩进)输出,并保留xml:space="preserve"中的空格?

我知道一个选项是编写自己的XmlWriter实现来处理这个问题,但如果有可用的框架,我宁愿使用框架提供的方法。

1个回答

3

自问自答问题所述,XmlWriter中存在一个bug。该bug表现为:XmlWriter将会遵守space:preserve标签,除非被标记的标签内没有空格。如果没有空格,则该标签可能会(出于某种原因)添加一些空格。因为内部也使用了XmlWriterXDocument也会表现出相同的行为。实际上,如果手动添加零长度空格,就像这样:

new XDocument(
    new XElement("a",
        new XElement("b",
           new XAttribute(XNamespace.Xml + "space", "preserve"),
              new XText(""),
              new XElement("c"))))
.Save(Console.Out);

它将保留空格和标签,并产生预期的输出。


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