pull解析xml文件

1.获得XmlpullParser类的引用

    这里有两种方法

  1. //解析器工厂
  2. XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
  3. XmlPullParser pullParser=factory.newPullParser();
  4.  
  5. //直接获得实例
    XmlPullParser pullParser= Xml.newPullParser();

2.设置解析内容

通过setInput方法设置解析内容   重载写的很清楚  把xml文件读取到Reader  或  InputStream中  注意  InputStream需要指定编码

  1. pullParser.setInput(getAssets().open("student.xml"),"utf-8");

getAssets().open("student.xml")返回一个字节流InputStream 所以需要指定编码格式

3.获取当前的事件类型 开始解析

  START_DOCUMENT 开始读取文档

  END_DOCUMENT  结束读取文档

  START_TAG  开始读取标签

  END_TAG    结束读取标签

xml数据

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <persons>
  3. <person id="1">
  4. <name>张三</name>
  5. <age>23</age>
  6. </person>
  7. <person id="2">
  8. <name>李四</name>
  9. <age>23</age>
  10. </person>
  11. </persons>

pull解析核心代码

  1. try {
  2. //解析器工厂
  3. XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
  4. //创建解析器
  5. XmlPullParser pullParser=factory.newPullParser();
  6. //直接创建解析器 //pullParser= Xml.newPullParser();
  7. //设置解析内容
  8. //getAssets().open("student.xml")返回一个字节流InputStream 所以需要指定编码格式
  9. pullParser.setInput(getAssets().open("student.xml"),"utf-8");
  10. //开始解析
  11. //获取当前解析的标签
  12. //获取当前事件类型:开始读取文档,开始读取标签,结束标签,结束读取文档 类似一个状态
  13. int type=pullParser.getEventType();
  14. while (type!=XmlPullParser.END_DOCUMENT){
  15. switch (type){
  16. //开始读取文档
  17. case XmlPullParser.START_DOCUMENT:
  18. break;
  19. //开始读取标签
  20. case XmlPullParser.START_TAG:
  21. String tag=pullParser.getName();//获取节点名
  22. if(tag.equals("person")){
  23. person=new Person();
  24. //获取节点属性
  25. String id=pullParser.getAttributeValue("","id");
  26. if (TextUtils.isEmpty(id)) continue;
  27. person.setId(Integer.parseInt(id));
  28. }else if(tag.equals("name")){
  29. //获取下一个文本
  30. String name=pullParser.nextText();
  31. if (TextUtils.isEmpty(name)) continue;
  32. person.setName(name);
  33. }else if(tag.equals("age")){
  34. String age=pullParser.nextText();
  35. if (TextUtils.isEmpty(age)) continue;
  36. person.setAge(Integer.parseInt(age));
  37. }
  38. break;
  39. //结束读取标签
  40. case XmlPullParser.END_TAG:
  41. tag=pullParser.getName();
  42. //当一个person 读取完成之后 添加到list
  43. if(tag.equals("person")){
  44. persons.add(person);
  45. }
  46. break;
  47. //结束读取文档
  48. case XmlPullParser.END_DOCUMENT:
  49. break;
  50. }
  51. //读取下一个事件
  52. type=pullParser.next();
  53. }
  54. } catch (XmlPullParserException e) {
  55. e.printStackTrace();
  56. } catch (IOException e) {
  57. e.printStackTrace();
  58. }

这里提一下getAttributeValue()方法 获取节点属性 有两个参第一个参数代表的是命名空间 什么xml是里的命名空间呢 一般xml文件根元素附加都会有xmlns 这就定义命名空间的

  1. 给属性添加命名空间后 就表示是那个命名空间的属性 类似包名 不过不常用

     
  2. SAX解析xml数据
      sax对文档进行顺序扫描 当扫描到
    文档开始结束,元素开始结束,标签开始结束都会触发事件
      sax的使用和pull差不多 个人喜欢用sax多一点,sax采用的事件驱动
      sax是通过重写方法来实现,符合条件就会触发回调 这些方法都是定义在ContentHandler接口中,Android为我们提供了一个帮助类
    DefaultHandler,只需要继承这个类,重写方法就ok
    核心代码
      
  1. 1 try {
  2. //创建SAX解析器
  3. SAXParserFactory factory=SAXParserFactory.newInstance();
  4. SAXParser parser= factory.newSAXParser();
  5. //自定一个Handler解析器
  6. PersonHandler handler=new PersonHandler();
  7. //解析器对xml进行解析
  8. parser.parse(getAssets().open("student.xml"),handler);
  9. for(Person p:handler.getPersonList()){
  10. Log.e("XmlSAXParser",p.getName()+"====="+p.getAge()+"=========="+p.getId());
  11. }
  12. } catch (ParserConfigurationException e) {
  13. e.printStackTrace();
  14. } catch (SAXException e) {
  15. e.printStackTrace();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  1. 解析器代码
  1.  
  1. public class PersonHandler extends DefaultHandler {
  2. //保存数据
  3. private List<Person> personList;
  4. private Person person;
  5. //节点名称 当前解析的元素名
  6. private String tag;
  7.  
  8. /**
  9. * 处理xml文件中读到到文本内容
  10. * @param ch 字符串内容
  11. * @param start 起始位置
  12. * @param length 长度
  13. * @throws SAXException
  14. */
  15. @Override
  16. public void characters(char[] ch, int start, int length) throws SAXException {
  17. super.characters(ch, start, length);
  18. //创建成字符串
  19. String text=new String(ch,start,length).trim();
  20. //字符串不能为空,既不读取空的文本节点,如换行
  21. if(TextUtils.isEmpty(text)) return;
  22. //当节点名称等于name时赋值
  23. if("name".equals(tag)){
  24. person.setName(text);
  25. }else if("age".equals(tag)){
  26. person.setAge(Integer.parseInt(text));
  27. }
  28. }
  29.  
  30. /**
  31. *
  32. * @param uri 命名空间 没啥用
  33. * @param localName 前缀标签名 没啥用
  34. * @param qName 节点名字
  35. * @param attributes 属性集合
  36. * @throws SAXException
  37. */
  38. @Override//qName attributes
  39. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  40. super.startElement(uri, localName, qName, attributes);
  41. tag=qName;
  42. //为什么创建集合 和对象 请看上面的xml 仔细分析
  43. if("persons".equals(qName)){
  44. //数据存储的集合
  45. personList=new ArrayList<>();
  46. }else if("person".equals(qName)){
  47. person=new Person();
  48. String id=attributes.getValue("id");
  49. if (!TextUtils.isEmpty(id)){
  50. person.setId(Integer.parseInt(id));
  51. }
  52. }
  53. }
  54.  
  55. @Override
  56. public void endElement(String uri, String localName, String qName) throws SAXException {
  57. super.endElement(uri, localName, qName);
  58. if("person".equals(qName)){
  59. personList.add(person);
  60. }
  61. }
  62.  
  63. }
  1. 还有startElement startDocument endDocument等方法
  2. 过几天会整理一个xmllistview的简单使用的Demo

Android 使用pull,sax解析xml的更多相关文章

  1. Dom,pull,Sax解析XML

    本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Do ...

  2. Android之SAX解析XML

    一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...

  3. Android SAX解析XML

    本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍: SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度 ...

  4. cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

    今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...

  5. SAX解析xml浅析

    SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,占用内存较少(相对 ...

  6. 安卓SAX解析XML文件

    XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...

  7. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  8. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  9. DOM&SAX解析XML

    在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...

随机推荐

  1. 自制Azure中国版“加血包”

    Micrsoft Azure中国版的国际出口最近升级为电话线拨号模式,目测为10个用户共享一条56kb的电话线拨号链路.有图有真相: 中国的IT从业者,有三分之一的职业生涯时间是在跟网络斗智斗勇.这点 ...

  2. 《Note --- Unreal --- MemPro (CONTINUE... ...)》

    Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...

  3. NYOJ 455

    1.应该交代清楚,参加宴会的人不知道一共有多少顶帽子.假如知道有n顶帽子的话,第一次开灯看见有n-1只,自然就知道自己是第n顶黑帽子,所以应该是这n个人在第一次关灯就打自己脸,不过这么一来就没意思了, ...

  4. php杂记(二)

    1.获取客户端真实IP if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $onlineip = $_SERVER['HTTP_CLIENT_IP']; } else ...

  5. Nginx学习笔记(二) Nginx--connection&request

    Nginx--connection&request 在Nginx中,主要包括了连接与处理两部分. connection 在src/core文件夹下包含有connection的源文件,Ngx_c ...

  6. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd

    下面是按着我所接触的架构模式,开始一个一个的说一下 第一 标准架构 三层结构

  7. SQL Server 游标运用:鼠标轨迹字符串分割

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 游标模板(Cursor Template) 鼠标轨迹字符串分割SQL脚本实现(SQL Code ...

  8. 对C语言islower、isupper、isdigit函数的测试

    今天朋友问起了这三个函数,我就帮忙测试了下,测试后发现谭浩强第四版课本附录上上讲的不是很严谨. 我们先看下这三个函数介绍: 谭浩强第四版课本附录第396页上这样介绍: 函数名 函数原型 功能 返回值 ...

  9. Docker 基础 : 数据管理

    用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作.容器中管理数据主要有两种方式:数据 ...

  10. Node学习笔记(三):基于socket.io web版你画我猜(一)

    经过惨淡的面试,也是知道了自己的不足,刚好最近在学习node,心中便有了做一个web版的你画我猜的想法 首先说下思路,在做准备工作的时候,有两个大概的思路: 1.规定一块div,捕捉鼠标事件,动态生成 ...