8

我正在从.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>

但为了便于阅读,我宁愿将“三”、“四”和“五”放在不同的行上:

<a>
  <b>
    <c>one</c>
    <c>two</c>
  </b>
  <b>three
    <c>four</c>
    <c>five</c>
  </b>
</a>

编辑:是的,我知道这在语法上有所不同,并且“不符合 xml 的精神”,但我很务实。最近我看到了只有 3 行的兆字节大小的 xml 文件——这些对于文本编辑器、源代码控制和差异工具来说都是具有挑战性的。需要做点什么!我已经测试过更改上述格式与我们的应用程序兼容。

4

5 回答 5

13

如果您确实想要该输出,则需要手动完成,并根据需要在节点周围添加空格。

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

<tag>foo</tag>

<tag>
    foo
</tag>

有不同的内容,如果序列化程序将前者更改为后者,它会改变您在请求<tag>.

通常的经验法则是,如果元素之间存在任何现有的非空白,则不会应用缩进。在这种情况下,three如果序列化程序应用了您想要的缩进,您的标签之间的标签将被修改,因此不会自动为您执行此操作。


如果您可以控制 XML 格式,则不建议像这样混合元素和文本子项,其中<b>既有文本 ( three) 也有元素 ( <c>) 子项,因为它会导致您所看到的问题。

于 2012-11-11T19:53:37.447 回答
3

由于赤裸裸的“三”,格式无法按照您想要的方式工作。它不在自己的标签中是有原因的吗?它应该是“b”的属性吗?

于 2012-11-11T19:15:27.267 回答
3

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

于 2013-04-18T17:12:43.053 回答
2

XML 是一种用于计算机的信息交换格式。空格是无关紧要的(实际上取决于位置和模式),因此,使用其中一个或另一个将是任意的。

您可以使用XmlTextWriterwithXElement.Save并查看是否可以使用XmlWriter.Settings 属性根据自己的喜好调整它

于 2012-10-16T11:02:08.403 回答
0

我之前不得不做类似的事情(对于客户请求)。我最终所做的只是编写一个自定义 .ToString() 方法,该方法仅用于在浏览器中显示 XML(呃,我知道)或用于下载内容的 xml 文件。因为代码不必在计算上高效,所以只需检查每个标签的子标签并安排“悬挂”文本。

最终我们能够说服用户文本应该是一个属性。

于 2013-04-23T21:47:38.470 回答