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符号
见:/article/6134439.html
可见, <, >, &, "这4个字符的实体引用都是一样的。
如果在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 原代码 | 显示结果 | 描述 |
< | < | 小于号或显示标记 |
> | > | 大于号或显示标记 |
& | & | 可用于显示其它特殊字符 |
" | “ | 引号 |
® | ® | 已注册 |
© | © | 版权 |
™ | ™ | 商标 |
半个空白位 | ||
一个空白位 | ||
不断行的空白 |
可见, <, >, &, "这4个字符的实体引用都是一样的。
相关文章推荐
- XML解析时候因为特殊字符&,<,",'出错
- 处理内容有&特殊字符thinkphp返回xml无法解析的问题<![CDATA[xxx]]>
- 在字符串中使用特殊字符<>"'&空格
- 数据库字段内容存在'、"、>、<等特殊字符,转义html字符输出
- xml 转义特殊字符 如&'"
- <s:if test="canSubscribe == 'Y'">能 </s:if> <s:else>不能 </s:else> 单字符需加.toString()
- XML DOMParser parseFromString特殊字符"&" "<"处理
- 如何在XML 加入特殊字符内容 如< >
- XML1.0基础 输出特殊字符 & < > " '
- TextField htmlText 以及xml里"<" 和 ">" 等特殊字符的显示问题
- Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml
- struts.xml中为什么加上<constant name="struts.devMode" value="true" />就出错
- xml 转义特殊字符 如&'"
- 特殊字符替换 > < " ' &
- Java特殊字符转义(<、>、"、/、&)
- 每当数据中有'<'、'&'等特殊字符时,封装的XML就无法解析,CDATA属性帮了大忙
- <s:if test="canSubscribe == 'Y'">能 </s:if> <s:else>不能 </s:else> 单字符需加.toString()
- xmlrpclib.Fault: <Fault 1: "cobbler.cexceptions.CX:'login failed'">
- Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml
- xml 转义特殊字符 如&'"