.Net XML序列化和转义或编码字符

时间:2009-07-01 19:26:13

标签: xml-serialization escaping

我在Web服务中大量使用XML序列化(合同将复杂类型作为params传递)。最近我注意到.Net XML序列化引擎正在逃避一些众所周知的5个保留字符,这些字符必须在包含在元素中时被转义(<,>,&,'和“)。我的第一反应是”好的老.Net,总是在找我“。

然后我开始尝试并注意到它只是逃避<,>和&,并且由于某种原因不是叛逆和双引号。例如,如果我在我的服务中的复杂类型的字段中返回此文字字符串:

 Bad:<>&'":Data

这是通过电线传输的(从Fiddler看到):

 Bad:&lt;&gt;&amp;'":Data

有没有人遇到这个或理解为什么会这样?串行器是否只是忽略它们或者是否有原因?据我所知,'和'并非在xml元素中有效。

2 个答案:

答案 0 :(得分:3)

根据XML spec,常规内容和标记:

  • &始终需要以&amp;转义,因为它是转义字符
  • <始终需要作为&lt;进行转义,因为它确定了元素的开头。它甚至必须作为安全性在属性内进行转义,并使编写解析器错误检测更简单。
  • >不需要转发为&gt;,但通常是<
  • 的对称 只有在' 分隔的属性中,
  • &apos;才需要以'转义 只有在"
  • 分隔的属性中,
  • &quot;才需要以"转义

在处理说明,评论和CDATA部分内部,规则会发生变化,但细节位于规范的2.4 Character Data and Markup部分。

你的序列化程序试图通过保持文件有点人性化来帮助你。

(以上每个也可以使用它们的数字等价物进行转义。)

答案 1 :(得分:0)

XMLSpy说你错了。以下是格式良好的XML:

<root>
    <data>'"</data>
</root>

除了“引用XMLSpy的参数”之外,更好的论据是XML Serializer已经超过七年了。在这个时候,我保证有人试图在Name属性中序列化“O'Brien”。这个bug现在已经被注意到了。