使用缩进和xml保存XDocument:space ="保留"

时间:2016-06-16 08:06:49

标签: c# .net xml

我想要打印一个XDocument,但在xml:space="preserve"个元素中保留空白区域。

此片段:

new XDocument(
    new XElement("a",
        new XElement("b",
            new XElement("c"))))
    .Save(Console.Out);

以下缩进输出的结果(这只是我想要的):

<a>
  <b>
    <c />
  </b>
</a>

但是,我们要说我需要在<b>元素中保留空格:

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>

这不好,因为缩进已在<{em> xml:space="preserve"范围内添加。在这种情况下,预期的输出是:

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

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

是否可以从XDocument 获得漂亮的打印(缩进)输出并在xml:space="preserve"内保持空白

我理解一个选项是编写我自己的XmlWriter实现来处理这个问题,但我宁愿使用框架中的东西(如果可用的话)。

1 个答案:

答案 0 :(得分:2)

似乎XmlWriter中存在一个错误,如this自我回答的问题所述。该错误是:XmlWriter会尊重space:preserve标记,除非标记有此属性的标记内有无空格。如果没有空格 - 它可以(由于某种原因)添加一些空格。因为内部XDocument也使用XmlWriter - 它显示相同的行为。事实上,如果你手动添加0长度的空格,就像这样:

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

它会尊重空白保留标记并产生预期的输出。