【问题标题】:How prevent System.Xml.XmlDocument from escaping attributes values如何防止 System.Xml.XmlDocument 转义属性值
【发布时间】:2009-11-12 11:03:31
【问题描述】:

我有一个 XML 文档要处理,其中包含以下属性:

<action name="foo -> bar">

如果我做一个简单的:

XmlDocument doc = new XmlDocument();
doc.Load(stInPath);
doc.Save(stOutPath);

属性字符串被转义:

<action name="foo -&gt; bar">

这正是我想要阻止的。

您知道有什么方法可以做到这一点(除了之后在 xml 文件上进行整个查找和替换)?

编辑:这似乎是一种合法的行为,我不必担心这一点(请参阅 Jon Skeet 的回答)

【问题讨论】:

  • 坦率地说,我有点惊讶于文档完全加载。
  • 但确实如此,并且如果您查询这些属性,则会保留这些属性。并不是说我认为这样做是个好主意,但这是客户的文件。
  • 你为什么不想逃避它?逃避它是正确的做法。我什至不确定属性中的“->”是否是有效的 xml。
  • @Fredrik:这是有效的 XML; ">" 除了在某些特定情况下,不需要 转义。见w3.org/TR/2008/REC-xml-20081126
  • @Vinzz:我试过了;似乎在加载文档时字符已经被转义了。

标签: c# xml xmldocument


【解决方案1】:

为什么你不需要它来应用转义?

任何普通的解析器在解析它时都应该应用适当的“反转义”。听起来您正试图将生成的 XML 文档作为纯文本文档进行测试,但这并不是一个好主意。 XML 文档应该几乎总是在下一步被提供给 XML 解析器,此时这不是问题。

我不知道有什么方法可以阻止 .NET XML 库这样做,如果他们有这样的工具,我会有些惊讶。

【讨论】:

  • 我确实在文本编辑器中读取 xml 文件(它应该是人类可读的,不是吗?)好吧,那么我可能会看到根本没有的问题.谢谢你的回答。
  • @Vinzz:是的,XML 应该是人类可以理解的。但它仍然 not 应该被视为纯文本。不要让您可以在文本编辑器中打开它这一事实分散您的注意力。
  • 不幸的是,并非所有的 XML 解析器都是平等的。我正在从 XmlDocument 输出一个 XML 文件,并且正在导入结果的基于 Java 的第三方程序不喜欢转义的属性值。
  • @EricJ.:我会至少要求第三方修复他们的代码。您可能需要暂时解决它 - 但从根本上说,这是他们程序中的一个错误,应该这样对待。
  • @JonSkeet:同意,但我下周发货,到那时他们不会修复它 :-) 我确实发布了错误报告,但也写了一个 hack 来对文件进行后处理.
【解决方案2】:

这正是我想要阻止的。

真的吗?是否应用转义通常并不重要。两者的 XML 信息集是相同的。

坦率地说,我对文档完全加载感到有点惊讶。

&gt; 是包含在属性值中的完全有效的字符。 &gt; 可能需要在 XML 中转义为 &amp;-escaped 的唯一位置是文本内容中的 ]]&gt; 序列,因为规范中的规则晦涩难懂。

为了避免考虑这个问题,许多 XML 序列化程序习惯性地在文本内容或属性值的任何地方转义 &gt;

Canonical XML 规范指定了一种序列化 XML 文档的特定方式,以便可以将输出作为简单字符串进行比较;例如,它准确地说明了属性应该如何排序。规范 XML 在文本内容中支持 &gt;-escaping,但在属性值中拒绝它。因此,如果您使用 Canonical XML 序列化程序来输出您的文档,您将获得该特定值的预期结果。 (不过,我不能保证它会是你想要的其他示例。)

您可以使用 XmlDsigC14NTransform(或者 XmlDsigC14NWithCommentsTransform)在 .NET 中获取规范化程序,例如:

XmlDsigC14NTransform transform= new XmlDsigC14NTransform(false);
transform.LoadInput(doc);
Stream stream= (Stream) t.GetOutput(typeof(Stream));
// write stream to file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2015-07-29
    • 1970-01-01
    • 2021-09-10
    • 2011-10-26
    • 2014-10-21
    相关资源
    最近更新 更多