编辑XML文件,并保留空格和制表符

问题描述:

我有可能会包含看起来像下面的空节点的XML文档:编辑XML文件,并保留空格和制表符

<metadata territory="USA"></metadata> 

简单地打开,然后使用XmlDocument的保存后,这一行看起来像:

<metadata territory="USA"> 
    </metadata> 

当我将PreserveWhitespace设置为true时,它将整个XML转换为1行,所以这不起作用。

这些XML文件需要尽可能保持当前的格式。我知道,从技术上讲,它们写入的方式并不重要,它们将以相同的方式读取,但我仍然需要保持相同的格式。我找不到一种方法来保持节点没有值为1行。有没有办法做到这一点?

保持原始格式的文档的唯一方法是,如果XML文件包含“xml:space =”在标题中保留“',但我要离开标题。

我想改变的唯一事情就是增加值。正如我所说的,只是加载和保存文档增加了这一点,所以如果你想测试,只是尝试...

XmlDocument doc = new XmlDocument(); 
doc.Load(@"C:\Temp\test.xml"); 
doc.Save(@"C:\Temp\test_02.xml"); 
+0

仅供参考,这是没有必要把 “C#” 的称号 - 这就是标签是。 – 2011-03-21 18:56:41

+0

你想解决什么问题?你为什么关心格式? – 2011-03-21 18:58:35

+0

这是我在这里的第一篇文章,所以我没有意识到我不需要标题中的“C#”,直到太晚。我关心格式的原因是因为这是一个我最初没有创建的工作文件,当我们发送资源时,格式需要与创建时相同。 – Marvin 2011-03-22 06:07:47

为什么不将文件保存为不同的格式,那么它的后其重命名为XML被保存。如果它的格式不正确,我会感到惊讶。不漂亮,但很容易。

我不认为这是可能的。加载XML文档时,会丢失格式化信息;所以Save无法给出相同的结果。

我与Richard Schneider:我不相信这是可能的。一种可能的解决方案是获取输出的XML文件,并通过XML格式化程序运行它,以规范化XML文件的格式(如果找不到,可以使用非托管XML dom编写一个XML文件)。

由于该文件总是正常化,它不会有太大的改变。

+0

+1永不放弃 – BinaryTox1n 2011-03-21 01:08:06

+0

这是令人沮丧的考虑XmlDocument在其他方面的优秀程度。我会一直搞乱它,看看我能不能拿出一些东西。不幸的是,它可能不是一个'干净的'解决方案...... – Marvin 2011-03-21 15:17:44

+0

据我所知,根本问题是XmlDocument是可变的 - 你可以很容易地修改解析树的方式,导致源文件和解析树之间的关系无法辨认。所以XML DOM抛弃了解析状态。 – 2011-03-21 18:53:24

只是做了测试,并通过设置PreserveWhitespace属性同时使用XDocumentXmlDocument

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.PreserveWhitespace = true; 
xmlDoc.Load("test.xml"); 
xmlDoc.Save("testOut.xml"); 
.. 
XDocument xdoc = XDocument.Load("test.xml", LoadOptions.PreserveWhitespace); 
xdoc.Save(@"testOut.xml"); 

输入:

<foo> 
    <metadata territory="USA"></metadata> 
    <bar></bar> 
    <baz> 
    </baz> 
</foo> 

输出:

<foo> 
    <metadata territory="USA"></metadata> 
    <bar></bar> 
    <baz> 
    </baz> 
</foo> 
+0

正如我所说,我已经尝试了这一点,不幸的是,它不起作用。当我创建自己的测试XML时,它可以工作,但是在我没有创建的其他测试中,它将所有内容放在一行上。 – Marvin 2011-03-21 15:00:39

+0

@Marvin您可能想要检查测试文档和实际文档之间编码和非打印字符的差异。如果你可以规范什么导致实际失败的测试方式,这可能是一个解决方案。表面上,人们并不关心他们看不到的东西是不同的...... – Shibumi 2011-03-21 20:06:28

如果您使用XmlDocument的,我可能会建议你使用的XDocument代替(框架3.0+)。

PreserveWhitespace将增加

<whatever> <...> 
**</whatever>** 

在每一行,而没有人会直接关闭它像< ... />。

我抬头看了5分钟,如何保留这些空白处,但找不到它。在de/reserialization中有一些省略字符(13)。

XDocument doc; 
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) 
{ 
    //Alternative with .None 
    doc = XDocument.Load(fs, LoadOptions.PreserveWhitespace); 
} 

和重要的..

xmlDoc.Save("lala.xml", SaveOptions.None);