Android在进行XML解析时特殊字符&显示问题

问题重现

昨天一早到公司,测试就给我说了一个Bug,关于一个消息通知显示的问题,正常的消息应该显示为:

恭喜XXX在XXX房间抽中XXX

一直也是正常显示的。那天突然就出现了一个异常显示:

恭喜               

问题原因     

通知后面的消息全都没有了。然而我自己在测试的N次中一直都没有复现,直到一个偶然的机会,突然看到我的应用中飘过一条消息:“恭喜                ”,大惊,赶快看日志,发现这是一个名为“&¥#@,。,。”一堆乱七八糟的符号问昵称的用户发的消息,我赶快找测试问这是谁发的,让再来几发。中间又经过一堆排除,最终发现异常是由于“&”符号引起的。

通知在显示时是通过拼接的一个HTML的<span>标签,然后进行解析显示的,XXX都有自己的样式,如颜色这些。我开始就怀疑是HTML标签中出现“ & ”符号,引起的异常,在查了一些资料和又把前人的代码查看了一番后,发现这个HTML文本,最终是以XML格式进行解析,然后拆分为不同字符串进行展示的,最终定位到了问题,由于XmlPullParser在解析时不能出现&符号,因为&符号是节点字符,所以不能直接使用,需要进行处理。

解决方法

在定位到问题后,就好办了。在此记录一下解决方式,以备后用。

&lt;          <        小于号

&gt;         >        大于号

&amp;     &        和号

&apos;     '         单引号

&quot;     "         双引号

注释:严格的说,在XML中只有字符“&”和字符“<”是非法的。注意最后的" ; "不能少。

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

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

非法的 XML 字符必须被替换为实体引用(entity reference)。

假如在 XML 文档中放置了一个类似 "<" 或 "&" 字符,那么这个会产生一个错误:

XmlPullParserException: unterminated entity ref

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

为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:

<message>if salary &lt; 1000 &amp;  then</message>

在解析中当有一大片的内容不需要解析时,可以考虑CDATA。术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束具体可以去查找一下资料

推荐阅读更多精彩内容

  • 1. XML简介 以下内容来自于http://www.w3school.com.cn/xml 基本知识 XML 和...
    WebSSO阅读 1,272评论 1 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 30,768评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,474评论 0 11
  • 1. 人为什么会嫉妒? 因为有想要的东西。 人为什么会憎恨? 因为想要的东西求而不得。 我强烈的嫉妒并憎恨着丛优优...
    小四不四阅读 167评论 4 1