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

时间:2012-10-16 10:38:05

标签: c# .net 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>

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

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

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

5 个答案:

答案 0 :(得分:13)

如果你想要那个输出,你需要手动完成,根据需要在节点周围添加空格。

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

<tag>foo</tag>

<tag>
    foo
</tag>

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

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


如果您可以控制XML格式,则不宜混合像这样的元素和文本子项,其中<b>同时包含文本(three)和元素(<c>)子项,因为它会引起你所看到的问题。

答案 1 :(得分:3)

由于裸体“三”,格式化不能按照您想要的方式工作。有没有理由不在它自己的标签中?它应该是“b”的属性吗?

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

您可以将XmlTextWriterXElement.Save一起使用,看看是否可以根据自己的喜好调整XmlWriter.Settings Property

答案 4 :(得分:0)

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

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