我正在从.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文件 - 这些对文本编辑器,源代码控制和差异工具都很有挑战性。有些事情需要做!我已经测试过,更改上面的格式与我们的应用程序兼容。
答案 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是一种用于计算机的信息交换格式。空白是无关紧要的(实际上取决于位置和架构),因此,使用其中一个是任意的。
您可以将XmlTextWriter
与XElement.Save
一起使用,看看是否可以根据自己的喜好调整XmlWriter.Settings Property
答案 4 :(得分:0)
我之前必须做类似的事情(针对客户请求)。我最后做的就是编写一个自定义.ToString()方法,该方法仅用于在浏览器中显示XML(呃,我知道)或者用于下载内容的xml文件。因为代码不必具有计算效率,所以仅仅是检查每个标签的子代并安排“悬挂”文本。
最终我们能够说服用户该文本应该是一个属性。