如何防止System.Xml.XmlDocument转义属性值

时间:2009-11-12 11:03:32

标签: c# xml xmldocument

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

<action name="foo -> bar">

如果我做一个简单的话:

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

属性字符串已转义:

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

我想要防止的是什么。

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

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

2 个答案:

答案 0 :(得分:5)

为什么你不需要应用逃脱?

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

我不知道有任何阻止.NET XML库这样做的方法,如果他们有这样的设施,我会感到有些惊讶。

答案 1 :(得分:4)

  

我想要防止的是什么。

真的?通常不重要的是逃避是否适用;两者的XML信息集是相同的。

  

坦率地说,文档加载时我有点惊讶。

>是包含在属性值中的完全有效的字符。唯一可能需要 >的地方 - 在XML中转义的文本内容中的&序列,由于其中的一个模糊而愚蠢的规则规格。

为了避免不必考虑问题,许多XML序列化程序习惯性地在文本内容或属性值的任何位置逃脱]]>

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

您可以使用XmlDsigC14NTransform(或者可能是XmlDsigC14NWithCommentsTransform)在.NET中获取规范化,类似于:

>