在讲这次错误之前,先看一下下面这段代码。 【◆以下解析方法是错误的×】


Baidu 或者 Google 一下 “Android Sax 解析” , 给出的Sample无一例外都是如此。 坑爹啊... 甚至连有些书籍中都是这么写的, 比如《Android开发入门与实践》。(本书亲自确认过,其他书情况不详)


没错, 一般情况下,这么写是可以的, 而且在大多数情况下解析出来也是正确的。 但是就是偶尔会出错, 这个时候通常你都莫不着头脑, 怎么回事? 数据没错啊,解析部分代码貌似也没问题.. 真是奇了怪了。 其实问题都出在上面那段代码上!!


大家都认为 SAX 解析过程大致如下:

startDocument -> startElement ->characters ->endElement ->endDocument


没错,就是这样,startElement 读取起始标签,endElement 读取结束标签,characters 呢?当然是读取其值, 这没错,但是大家都天真的以为characters 只执行一次,并且一次就读取了全部内容。错就错在这!


其实characters 是很有可能会执行多次的,当遇到内容中有回车,\t等等内容时,它很有可能就执行多次。 有的人可能会说,那我没有这些是不是就只执行一次了? 看下我实测结果:

【Android】SAX解析之错误纠正!!


测试用XML如下:


可以很明显的看到,在解析 <ArticleID>1000553</ArticleID> 这一段时,characters执行了两次,将内容"1000553"分两次读取.. 用上面那种方式的最终结果就是ArticleID = 00553 了。 那如果你的应用需要根据这个id 进一步获取内容岂不是死翘翘了?(比如这边根据id获取新闻详细内容)


好了,废话不多说了,看下正确的写法! 【★以下解析方法才是正确的 √ 】


归纳为三点:

1.startElement的时候,new StringBuilder(); 或者sb.setLength(0); (我建议后者)
2.characters的时候,sb.append(ch, start, length);
3.endElement的时候,sb.toString(); 此时StringBuilder中的内容才是解析的结果


通过这种方法就不会再有数据离奇丢失的情况了(同时也不需要像错误方法那样再设个currentTag之类的了,逻辑繁杂了,还出错)!


希望大家可以尽早看到这篇文章,不要继续被吭了!!!


更多相关文章

  1. Android Studio 编译错误: Error: java.util.concurrent.Executio
  2. android获取短信内容
  3. android studio 常见错误总结
  4. TextView 内容居中
  5. Android TextView解析HTML内容
  6. Android手机开发——向SD卡上的文件追加内容
  7. Android TextView内容设置超链接、颜色、字体
  8. Android原生AlertDialog修改标题,内容,按钮颜色,字体大小等
  9. Android 工程重命名错误

随机推荐

  1. Android用户界面 UI组件--AdapterView及
  2. Android版本问题记录:Android(安卓)8.0下
  3. Android(安卓)RelativeLayout 属性
  4. Android用户界面 UI组件--ImageView及其
  5. android学习笔记
  6. android中的Selector的用法---主要是改变
  7. Android(安卓)控件布局常用属性
  8. Android开发:原生+H5之:Android(安卓)webvi
  9. Android(安卓)面试必备 - 系统、App、Act
  10. android 进程与线程 - 开发文档翻译 - 进