C# 编辑xml文件并保留空白和制表符

C# 编辑xml文件并保留空白和制表符,c#,xml,C#,Xml,我有一个XML文档,其中包含如下所示的空节点: <metadata territory="USA"></metadata> 为什么不将文件另存为其他格式,然后在保存后将其重新命名为XML呢。如果它的格式仍然不正确,我会感到惊讶。不太好,但很容易。我认为这是不可能的。加载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);