您的位置:首页 > 其它

XML解析时候因为特殊字符&,<,>,",'出错

2012-12-05 14:40 441 查看
不合法的XML字符必须被替换为相应的实体。

如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该象下面那样书写代码:

<message>if salary < 1000 then</message>

为了避免出现这种情况,必须将字符"<" 转换成实体,象下面这样:

<message>if salary < 1000 then</message>

下面是五个在XML文档中预定义好的实体,也称实体引用(entity reference):

< < 小于号

> > 大于号

& & 和

' ' 单引号

" " 双引号

实体必须以符号"&"开头,以符号";"结尾。 注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。

因此,在 XML 元素中,"<" 和 "&" 是非法的。

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

其实还可以有另外的办法。就是自己定义一个来标识自己需要的字符,然后解析时候处理一下,我用%101来表示&字符。解析时候加上替换就好了。(不过多的时候还是很麻烦,可以编辑时候替换&为%101)

比较典型的例子就是一些发布系统里,用户可能输入这些字符,如果这些内容被作为html节点,当html文件内容分发给客户端时,如果这些节点当做xml来解析,解析器就会抛出异常。

比如:

博客正文

用户插入的图片:

<img TITLE=""
ALT="为什么宋江来到梁山后晁盖必死(图)【博客首页】" SRC="http://s5.sinaimg.cn/bmiddle/4850e3f3gcfd95ac52b14&690"
ACTION-TYPE="show-slide" ACTION-DATA="http://s11.sinaimg.cn/middle/4850e3f3gc962f94118ba&690"
/>

博客正文

这里如果客户端app在解析img的src时,&字符是非法的,正确的作法是:

<img TITLE=""
ALT="为什么宋江来到梁山后晁盖必死(图)【博客首页】" SRC=http://s5.sinaimg.cn/bmiddle/4850e3f3gcfd95ac52b14&690
ACTION-TYPE="show-slide" ACTION-DATA=http://s11.sinaimg.cn/middle/4850e3f3gc962f94118ba&690
/>

在xml解析后,解析器会把预定义的实体替换成字符。在解析前客户端显然不宜做字符串替换,原因是如果替换这些字符,xm解析前的串甚至可能被改成了非xml字符串。

而且,替换后的html文件在浏览器里面还是可以识别的。

原文地址:/article/9398242.html

相关科普:

DDOM http://baike.baidu.com/view/14806.htm#sub14806

DTD: http://baike.baidu.com/view/147436.htm

另外还需要注意的是,一般C#和Java里面,HttpUtility.HtmlDecode()会把这些实体引用转换成字符,所以在调用xml解析之前不应该调用HttpUtility.HtmlDecode()。可以先通过正则表达式匹配出img节点,然后把img节点之间的文字进行HttpUtility.HtmlDecode()以便于客户端的显示。

附:常用HTML符号

HTML 原代码显示结果描述
<<小于号或显示标记
>>大于号或显示标记
&&可用于显示其它特殊字符
"引号
®®已注册
©©版权
商标
半个空白位
一个空白位
 不断行的空白
见:/article/6134439.html

可见, <, >, &, "这4个字符的实体引用都是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐