C# 编辑xml文件并保留空白和制表符
我有一个XML文档,其中包含如下所示的空节点:C# 编辑xml文件并保留空白和制表符,c#,xml,C#,Xml,我有一个XML文档,其中包含如下所示的空节点: <metadata territory="USA"></metadata> 为什么不将文件另存为其他格式,然后在保存后将其重新命名为XML呢。如果它的格式仍然不正确,我会感到惊讶。不太好,但很容易。我认为这是不可能的。加载XML文档时,会丢失格式信息;所以存钱不可能得到同样的结果。我和理查德·施奈德在一起:我不相信这是可能的。一种可能的解决方案是获取输出XML文件并通过XML格式化程序运行它,该程序规范化XML文件的格式(
<metadata territory="USA"></metadata>
为什么不将文件另存为其他格式,然后在保存后将其重新命名为XML呢。如果它的格式仍然不正确,我会感到惊讶。不太好,但很容易。我认为这是不可能的。加载XML文档时,会丢失格式信息;所以存钱不可能得到同样的结果。我和理查德·施奈德在一起:我不相信这是可能的。一种可能的解决方案是获取输出XML文件并通过XML格式化程序运行它,该程序规范化XML文件的格式(如果找不到非托管XML dom,您可能可以使用非托管XML dom编写一个)
由于文件始终是规范化的,所以希望不会有太大的变化。刚刚做了测试,通过设置
preservewitspace
属性,使用XDocument
和XmlDocument
这两种方法都可以工作
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>
输出:
<foo>
<metadata territory="USA"></metadata>
<bar></bar>
<baz>
</baz>
</foo>
<foo>
<metadata territory="USA"></metadata>
<bar></bar>
<baz>
</baz>
</foo>
如果您使用的是xmlDocument,我可能建议您改用XDocument(Framework 3.0+) 保留空白将添加一个
<whatever> <...>
**</whatever>**
重要的是
xmlDoc.Save("lala.xml", SaveOptions.None);
正如我所说,我已经试过了,不幸的是,它不起作用。当我创建自己的测试XML时,它工作了,但在我没有创建的其他测试XML上,它将所有内容放在一行。@Marvin您可能需要检查测试文档和实际文档之间编码和非打印字符的差异。如果您可以规范化导致实际测试失败的原因,那么这可能是一个解决方案。从表面上看,人们并不关心他们看不到的东西是否不同……考虑到XmlDocument在其他方面有多伟大,这令人沮丧。我会继续胡闹,看看能不能想出点什么。不幸的是,它可能不是一个“干净”的解决方案……据我所知,基本问题是XmlDocument是可变的——您可以很容易地修改解析树,从而导致源文件和解析树之间的关系无法识别。因此XML DOM抛弃了解析状态。仅供参考,没有必要在标题中加上“C”—这就是标记的用途。您想解决什么问题?你为什么关心格式?这是我在这里的第一篇文章,所以我直到太晚才意识到我不需要标题中的“C”。我之所以关心格式,是因为这是一个我最初没有创建的工作文件,当我们发送资产时,格式需要与创建时相同。不,如果只是格式,那就没关系了。XML不关心“格式化”。@JohnSaunders:保持原始版本和编辑版本之间的差异是一个原因(至少现在是我的原因)。并不总是希望更改XML中的一个值以产生完整的文件差异。
xmlDoc.Save("lala.xml", SaveOptions.None);