Android[中级教程]第六章 XML解析之SAX解析器

分类: Android中级2011-10-06 01:52 125人阅读 评论(1) 收藏 举报

接上一章,这一章我们就来学习SAX解析器,其实SAX跟PULL解析器差不多,事实上学会和掌握一种XML解析器对于完成项目来说已经足够了,当然,多学一点也不是什么坏事,你说呢?呵呵,加油哦!我们还是以唐僧师徙的数据为例

view plain
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persons>
  3. <person id = "1">
  4. <status>大徙弟</status>
  5. <name>孙悟空</name>
  6. <tool>金箍棒</tool>
  7. <number>杀死了50只妖怪</number>
  8. </person>
  9. <person id = "2">
  10. <status>二徙弟</status>
  11. <name>猪八戒</name>
  12. <tool>九齿钉耙 </tool>
  13. <number>杀死了40只妖怪</number>
  14. </person>
  15. <person id = "3">
  16. <status>三徙弟</status>
  17. <name>沙和尚</name>
  18. <tool>降妖宝杖</tool>
  19. <number>杀死了30只妖怪</number>
  20. </person>
  21. </persons>

xml文件跟上一章的一样,如果不清楚的话可以参考一下上一章

Android[中级教程]第五章 XML解析之PULL解析器

这里我就主要放上SAXHandler的源码了

view plain
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import org.xml.sax.Attributes;
  4. import org.xml.sax.SAXException;
  5. import org.xml.sax.helpers.DefaultHandler;
  6. public class SaxHandler extends DefaultHandler
  7. {
  8. private List<Person> persons;
  9. private Person person;
  10. private String tagName;//作用是记录解析时的上一个节点名称
  11. public List<Person> getPersons(){
  12. return persons;
  13. }
  14. /**
  15. * 节点处理
  16. */
  17. @Override
  18. public void characters(char[] ch, int start, int length)
  19. throws SAXException
  20. {
  21. String data = new String(ch, start, length);
  22. if("status".equals(tagName)){
  23. person.setStatus(data);
  24. }
  25. if("name".equals(tagName)){
  26. person.setName(data);
  27. }
  28. if("tool".equals(tagName)){
  29. person.setTool(data);
  30. }
  31. if("number".equals(tagName)){
  32. person.setNumber(data);
  33. }
  34. }
  35. /**
  36. * 元素结束
  37. */
  38. @Override
  39. public void endElement(String uri, String localName, String qName)
  40. throws SAXException
  41. {
  42. if("person".equals(localName)){
  43. persons.add(person);
  44. person = null;
  45. }
  46. tagName = null;
  47. }
  48. /**
  49. * 文档开始
  50. */
  51. @Override
  52. public void startDocument() throws SAXException
  53. {
  54. persons = new ArrayList<Person>();
  55. }
  56. /**
  57. * 元素开始
  58. */
  59. @Override
  60. public void startElement(String uri, String localName, String qName,
  61. Attributes attributes) throws SAXException
  62. {
  63. if("person".equals(localName)){
  64. person = new Person();
  65. person.setId(attributes.getValue("id"));
  66. }
  67. tagName = localName;//将正在解析的节点名称赋给tagName
  68. }
  69. }

接着就是Activity中的源码:

view plain
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.xml.parsers.SAXParser;
  8. import javax.xml.parsers.SAXParserFactory;
  9. import android.app.Activity;
  10. import android.os.Bundle;
  11. import android.os.Environment;
  12. import android.widget.ListView;
  13. import android.widget.SimpleAdapter;
  14. public class PullActivity extends Activity
  15. {
  16. private ListView listView;
  17. private SimpleAdapter adapter;
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState)
  20. {
  21. // TODO Auto-generated method stub
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.xml_handler);
  24. listView = (ListView)findViewById(R.id.xml_list);
  25. try
  26. {
  27. //自完义适配方法
  28. getAdapter();
  29. } catch (Exception e)
  30. {
  31. e.printStackTrace();
  32. }
  33. listView.setAdapter(adapter);
  34. }
  35. //自定义适配方法
  36. private void getAdapter() throws Exception
  37. {
  38. List<Map<String, String>> lists = new ArrayList<Map<String, String>>();
  39. //这一部分就是刚才我们做测试用的部分
  40. File SD_Files = Environment.getExternalStorageDirectory();
  41. String file_path = SD_Files.getName() + File.separator + "persons.xml";
  42. //      FileInputStream input = new FileInputStream(new File(file_path));
  43. //      PullHandler pullHandler = new PullHandler(input);
  44. //      List<Person> persons = pullHandler.getPersons();
  45. FileInputStream fis = new FileInputStream(new File(file_path));
  46. SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
  47. SaxHandler saxHandler = new SaxHandler();
  48. parser.parse(fis, saxHandler);
  49. List<Person> persons = saxHandler.getPersons();
  50. //将persons中的数据转换到ArrayList<Map<String, String>>中,因为SimpleAdapter要用这个类型的数据进行适配
  51. Map<String, String> map;
  52. for(Person p : persons){
  53. map = new HashMap<String, String>();
  54. map.put("id", p.getId());
  55. map.put("status", p.getStatus());
  56. map.put("name", p.getName());
  57. map.put("tool", p.getTool());
  58. map.put("number", p.getNumber());
  59. lists.add(map);
  60. }
  61. //HashMap<String, String>中的key
  62. String[] from = {"id", "status", "name", "tool", "number"};
  63. //list_item.xml中对应的控件ID
  64. int[] to = {R.id.item_id, R.id.item_status, R.id.item_name, R.id.item_tool, R.id.item_number};
  65. adapter = new SimpleAdapter(this, lists, R.layout.handler_list_item, from, to);
  66. }
  67. }

其他的跟PULL解析都一样的,这里只是将PULL解析换成了SAX解析,在源码中就是把中间的三行代码换成了SAX解析的代码,上图:

看,都是一样的,下一章要介绍DOM解析器了,希望大家能好好学习,谢谢

Android[中级教程]第六章 XML解析之SAX解析器相关推荐

  1. Android[中级教程]第五章 XML解析之PULL解析器

    这一章我们来学习Android中的XML解析器,Android中自带了三个XML解析器,有PULL,SAX,DOM解析器,其中PULL跟SAX都是以事件作为驱动导向的解析器,优点是占用内存小,处理速度 ...

  2. 2022版Maven教程 - 第六章 单一架构案例

    2022版Maven教程 - 第六章 单一架构案例 一.创建工程,引入依赖 1.架构 ①架构的概念 ②单一架构 2.创建工程 3.引入依赖 ①搜索依赖信息的网站 [1]到哪儿找? [2]怎么选择? ② ...

  3. 第六章、epub文件处理 -- 解析container文件与.opf文件

    2019独角兽企业重金招聘Python工程师标准>>> 第六章.epub文件处理 -- 解析container文件与.opf文件 这一章我们会接着第三章结尾介绍的FBReaderAp ...

  4. Android Camera2 教程 · 第三章 · 预览

    Android Camera2 教程 · 第三章 · 预览 DarylGo关注 Android Camera 上一章<Camera2 开启相机>我们学习了如何开启和关闭相机,接下来我们来学 ...

  5. java界面编辑教程_java程序设计基础教程第六章图形用户界面编辑.docx

    java程序设计基础教程第六章图形用户界面编辑.docx 还剩 27页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要 ...

  6. linux教程第六章,Linux教程(第六章).ppt

    Linux教程(第六章) 1 计算机专业必修课程linux第六章 系统管理 教师: 李晓红 信息科学与工程学院计算机系 2005/8 2 主要内容 性能及内核管理 软件包管理 用户和工作组管理 设备管 ...

  7. AArch64教程第六章

    AArch64教程第六章 Nov 27, 2016 • Roger Ferrer Ibáñez • AArch64 到目前为止我们知道如何做一些计算和访问内存.今天我们将学习怎样修改我们程序的控制流. ...

  8. XML的概述,.Dom4解析和SAX解析

    1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) XML 是一种标记语言,很类似 H ...

  9. Java:XML之JavaSE SAX解析

    XML之JavaSE SAX解析 概述 SAX(Simple API For XML)是一个公共的基于事件的XML文档解析标准,能够通过一个简单的.快速的方法来对XML文档进行处理,和DOM相比它所占 ...

最新文章

  1. android:theme.holo.light.,Android: Theme.Holo.Light.NoActionBar vs Theme.Light.NoTitleBar
  2. nib、xib、storyboard(故事板)
  3. Spring mvc整合freemarker详解
  4. [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
  5. AUTOSAR从入门到精通100讲(131)-AURIX中DMA模块对TIM的FIFO数据搬运
  6. mybatis typehandler
  7. cairosvg在linux中的安装_直接用ISO文件在linux上安装新系统
  8. Windows Server 2003服务器安装前设置
  9. 最可怕的八种黑客手段,网络攻击真是无孔不入!【转载】
  10. chrome应用程序无法启动因为并行配置不正确_Win8打不开软件提示并行配置不正确的解决方法...
  11. java顺序存储_顺序存储-数据结构-java实现
  12. 关于webpack升级过后不能打包的问题;
  13. 软考软件设计师考试总结(2019下半年)
  14. 【车间调度】 FJSP的析取图模型
  15. java面试常见知识点整理
  16. 统计单表中时间有重叠的数据--同一人出入院时间重叠
  17. 阿里云轻量服务器windows系统远程桌面无法连接?
  18. Unity3D 游戏开发学习资料(不断更新中。。。)
  19. 计算机经典书籍- -
  20. ld: i386 架构于输入文件 bar.o 与 i386:x86-64 输出不兼容

热门文章

  1. 矩阵标准化处理(内附MATLAB代码)
  2. 淋雨量matlab,人在雨中行走的淋雨量讨论
  3. 宏基X32和宏基X 32FP评测
  4. 怀疑开发者在“造核弹”?GitHub不断封禁开源项目
  5. strcpy没有声明 c++头文件详解
  6. Matplotlib绘图(基础篇)
  7. 基于 MDK5的串口通信实验
  8. PHP变量、引用、函数传参之彻底掌握,从此节操是路人
  9. 华为电脑其他应用正常使用唯独浏览器网络连接不上小米路由器
  10. 在isic数据集上进行malignant和nevus的分类尝试