每行写入最多两个标签的xml

Col*_*nic 8 .net c# xml linq-to-xml

我正在从.NET的XElement中保存xml.我一直在使用方法ToString,但格式化看起来不像我想要的(下面的例子).我最多每行两个标签.我怎样才能做到这一点?


拯救XElement.Parse("<a><b><c>one</c><c>two</c></b><b>three<c>four</c><c>five</c></b></a>").ToString()给了我

<a>
  <b>
    <c>one</c>
    <c>two</c>
  </b>
  <b>three<c>four</c><c>five</c></b>
</a>
Run Code Online (Sandbox Code Playgroud)

但为了便于阅读,我宁愿"三个","四个"和"五个"分开:

<a>
  <b>
    <c>one</c>
    <c>two</c>
  </b>
  <b>three
    <c>four</c>
    <c>five</c>
  </b>
</a>
Run Code Online (Sandbox Code Playgroud)

编辑:是的我明白这在语法上是不同的,"不符合xml的精神",但我是务实的.最近我看到只有3行的兆字节大小的xml文件 - 这些对文本编辑器,源代码控制和差异工具都很有挑战性.有些事情需要做!我已经测试过,更改上面的格式与我们的应用程序兼容.

Jas*_*ers 13

如果您想要完全输出,则需要手动完成,根据需要在节点周围添加空格.

XML文档中的几乎所有空格都很重要,即使我们只将其视为缩进.当我们要求序列化程序为我们缩进文档时,它会对可以提取的内容进行更改,因此他们尽可能保守.要素

<tag>foo</tag>
Run Code Online (Sandbox Code Playgroud)

<tag>
    foo
</tag>
Run Code Online (Sandbox Code Playgroud)

具有不同的内容,如果序列化程序将前者更改为后者,则会在请求内容时更改从XML API返回的内容<tag>.

通常的经验法则是,如果元素之间存在任何非空白,则不会应用缩进.在这种情况下,three如果序列化程序应用了您想要的缩进,则会修改标签之间的标签,因此没有任何内容可以自动为您完成.


如果您可以控制XML格式,那么就不宜混合像这样的元素和文本子元素,其中<b>包含text(three)和element(<c>)子元素,因为它会导致像您所看到的问题.


Col*_*nic 3

向同事解释了原因 - 我们将更改文件格式。我建议你也尝试这样做。想要做我想做的事几乎是不可能的,因为大多数 xml 工具都认为空格很重要。

  • 问题是你有混合内容节点 - 如果你可以摆脱它缩进就可以了。在更改格式之前,请查看实现您自己的 XmlWriter(始终将元素放在新行上)是否可以为您解决问题。 (3认同)