【问题标题】:C# XmlDocument with custom formatting具有自定义格式的 C# XmlDocument
【发布时间】:2012-11-16 11:02:49
【问题描述】:

这段代码:

XmlNode columnNode = null;                               
columnNode = xmlDoc.CreateElement("SYSID");
columnNode.InnerText = ""; // Empty string
newRowNode.AppendChild(columnNode);

...这样做:

<SYSID>
</SYSID>

我想要这个,当字符串为空时:

<SYSID></SYSID>

有什么解决办法吗?

【问题讨论】:

  • 您应该将XmlDocument.PreserveWhitespace 设置为false,但这将适用于所有节点
  • @NaNNy 你为什么在这里发表评论,而不是在下面提供答案?
  • 因为这不是他要找的答案
  • 无论如何,在对数据进行任何处理之前,必须将 XML 转换为规范的 XML。请参阅en.wikipedia.org/wiki/Canonical_XML 了解更多信息。我的意思是,元素是否在同一行并不重要。
  • @NaNNy 谢谢,但正如你所说,这不是我想要的答案..

标签: c# .net xml xmldocument


【解决方案1】:

如果您有另一个需要该格式的工具,那么另一个工具就是错误的 - 它无法读取 XML。因此,如果您可以控制其他工具,我建议您修复它,而不是试图强制您的代码匹配它。

如果您无法修复其他工具...

如果您只是构建一个 Document 并将其写入磁盘,那么您可以使用流并自己直接写入元素(作为简单文本)。这将比使用 XmlDoc 更快(并且可能更容易)。

作为对此的改进,您可以使用 XmlWriter 写入元素,但是当您写入空元素时,将原始文本写入流(即 writer.WriteRaw("\n")) 以便您控制这些特定元素的格式。

如果您需要构建内存中的 XmlDocument,那么在很大程度上您必须忍受它在要求序列化到磁盘时使用的格式(除了 PreserveWhitespace 之类的基本设置,您在问处理存储信息的文档,因此您对 XmlDocument 封装的功能失去了很多控制)。在这种情况下,我能想到的最佳建议是将 XmlDocument 写入 MemoryStream,然后对该内存流进行后处理以从空元素中删除换行符。 (糟糕!)

【讨论】:

  • 好的,杰森,谢谢。那么正确的 XML 格式是在 value 为空时开始新行?
  • XML 通常会忽略空格,因此元素开始和结束标记之间的任何换行符通常都会被忽略 - 所以 &lt;x&gt;&lt;/x&gt;&lt;x&gt;\n&lt;/x&gt;(其中 \n 是换行符)或 &lt;x/&gt;(空element) 通常被认为是等价的。 (但是,如果您真的想从文档中检索空白,可以在 XmlDoc 中打开 PreserveWhitespace 选项)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多