我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android解析XML的三种方式SAX、Pull、Dom

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android解析XML的三种方式SAX、Pull、Dom

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),本文对android解析xml的这三种方式进行一次总结。

今天解析的xml示例(channels.xml)如下:


<?xml version="1.0" encoding="utf-8"?>
<channel>
<item id="0" url="http://www.baidu.com">百度</item>
<item id="1" url="http://www.qq.com">腾讯</item>
<item id="2" url="http://www.sina.com.cn">新浪</item>
<item id="3" url="http://www.taobao.com">淘宝</item>
</channel> 

 一、使用sax方式解析

 基础知识:

     这种方式解析是一种基于事件驱动的api,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源),事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。

下面是ContentHandler接口的常用方法

     public abstract void characters (char[] ch, int start, int length)

      这个方法来接收字符块通知,解析器通过这个方法来报告字符数据块,解析器为了提高解析效率把读到的所有字符串放到一个字符数组(ch)中,作为参数传递给character的方法中,如果想获取本次事件中读取到的字符数据,需要使用start和length属性。

    public abstract void startDocument () 接收文档开始的通知

     public abstract void endDocument () 接收文档结束的通知

    public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文档开始的标签

    public abstract void endElement (String uri, String localName, String qName) 接收文档结束的标签

    在一般使用中为了简化开发,在org.xml.sax.helpers提供了一个DefaultHandler类,它实现了ContentHandler的方法,我们只想继承DefaultHandler方法即可。

   另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。

   看了些基础以后开始上代码吧(核心代码,下载代码在附件)


public class SAXPraserHelper extends DefaultHandler {
 final int ITEM = 0x0005;
 List<channel> list;
 channel chann;
 int currentState = 0;
 public List<channel> getList() {
  return list;
 }
 
 @Override
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  // TODO Auto-generated method stub
// super.characters(ch, start, length);
  String theString = String.valueOf(ch, start, length);
  if (currentState != 0) {
   chann.setName(theString);
   currentState = 0;
  }
  return;
 }
 
 @Override
 public void endDocument() throws SAXException {
  // TODO Auto-generated method stub
  super.endDocument();
 }
 
 @Override
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  // TODO Auto-generated method stub
  if (localName.equals("item"))
   list.add(chann);
 }
 
 @Override
 public void startDocument() throws SAXException {
  // TODO Auto-generated method stub
  list = new ArrayList<channel>();
 }
 
 @Override
 public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {
  // TODO Auto-generated method stub
  chann = new channel();
  if (localName.equals("item")) {
   for (int i = 0; i < attributes.getLength(); i++) {
    if (attributes.getLocalName(i).equals("id")) {
     chann.setId(attributes.getValue(i));
    } else if (attributes.getLocalName(i).equals("url")) {
     chann.setUrl(attributes.getValue(i));
    }
   }
   currentState = ITEM;
   return;
  }
  currentState = 0;
  return;
 }
}

private List<channel> getChannelList() throws ParserConfigurationException, SAXException, IOException
 {
  //实例化一个SAXParserFactory对象
  SAXParserFactory factory=SAXParserFactory.newInstance();
  SAXParser parser;
  //实例化SAXParser对象,创建XMLReader对象,解析器
  parser=factory.newSAXParser();
  XMLReader xmlReader=parser.getXMLReader();
  //实例化handler,事件处理器
  SAXPraserHelper helperHandler=new SAXPraserHelper();
  //解析器注册事件
  xmlReader.setContentHandler(helperHandler);
  //读取文件流
  InputStream stream=getResources().openRawResource(R.raw.channels);
  InputSource is=new InputSource(stream);
  //解析文件
  xmlReader.parse(is);
  return helperHandler.getList();
 }

从第二部分代码,可以看出使用SAX解析XML的步骤:

1、实例化一个工厂SAXParserFactory

2、实例化SAXPraser对象,创建XMLReader 解析器

3、实例化handler,处理器

4、解析器注册一个事件

4、读取文件流

5、解析文件

二、使用pull方式解析

基础知识:

      在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。

其实以上描述,就是对整个解析步骤的一个描述,看看代码吧


private List<Map<String, String>> getData() {
  List<Map<String, String>> list = new ArrayList<Map<String, String>>();
  XmlResourceParser xrp = getResources().getXml(R.xml.channels);
  try {
   // 直到文档的结尾处
   while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {
    // 如果遇到了开始标签
    if (xrp.getEventType() == XmlResourceParser.START_TAG) {
     String tagName = xrp.getName();// 获取标签的名字
     if (tagName.equals("item")) {
      Map<String, String> map = new HashMap<String, String>();
      String id = xrp.getAttributeValue(null, "id");// 通过属性名来获取属性值
      map.put("id", id);
      String url = xrp.getAttributeValue(1);// 通过属性索引来获取属性值
      map.put("url", url);
      map.put("name", xrp.nextText());
      list.add(map);
     }
    }
    xrp.next();// 获取解析下一个事件
   }
  } catch (XmlPullParserException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return list;
 }

三、使用Dom方式解析

基础知识:

     最后来看看Dom解析方式,这种方式解析自己之前也没有用过(在j2ee开发中比较常见,没有做过这方面的东西),在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这样的移动设备来讲,内存是非常有限的,所以对于比较大的XML文件,不推荐使用这种方式,但是Dom也有它的优点,它比较直观,在一些方面比SAX方式比较简单。在xml文档比较小的情况下也可以考虑使用dom方式。

Dom方式解析的核心代码如下:


public static List<channel> getChannelList(InputStream stream)
 {
  List<channel> list=new ArrayList<channel>();
  //得到 DocumentBuilderFactory 对象, 由该对象可以得到 DocumentBuilder 对象
  DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  try {
   //得到DocumentBuilder对象
   DocumentBuilder builder=factory.newDocumentBuilder();
   //得到代表整个xml的Document对象
   Document document=builder.parse(stream);
   //得到 "根节点" 
   Element root=document.getDocumentElement();
   //获取根节点的所有items的节点
   NodeList items=root.getElementsByTagName("item"); 
   //遍历所有节点
   for(int i=0;i<items.getLength();i++)
   {
    channel chann=new channel();
    Element item=(Element)items.item(i);
    chann.setId(item.getAttribute("id"));
    chann.setUrl(item.getAttribute("url"));
    chann.setName(item.getFirstChild().getNodeValue());
    list.add(chann);
   }
  } catch (ParserConfigurationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SAXException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return list;
 }

总结一下Dom解析的步骤(和sax类似)

1、调用 DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工厂类实例。

2、调用解析器工厂实例类的 newDocumentBuilder() 方法得到 DOM 解析器对象

3、调用 DOM 解析器对象的 parse() 方法解析 XML 文档得到代表整个文档的 Document 对象。

四、总结

       除以上三种外还有很多解析xml的方法,比如DOM4J、JDOM等等。但其基本的解析方式包含两种,一种是事件驱动的(代表SAX),另一种方式是基于文档结构(代表DOM)。其他的只不过语法不一样而已。

源码下载:Android解析XML

原文地址:http://www.cnblogs.com/JerryWang1991

您可能感兴趣的文章:Android 创建与解析XML(五)——详解Dom4j方式Android开发之DOM解析xml文件的方法Android编程解析XML方法详解(SAX,DOM与PULL)Android创建与解析XML(二)——详解Dom方式Android应用中使用DOM方式解析XML格式数据的基本方法详解Android之解析XML文件三种方式(DOM,PULL,SAX)Android利用SAX对XML进行增删改查操作详解Android利用Dom对XML进行增删改查操作详解


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android解析XML的三种方式SAX、Pull、Dom

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android解析XML的三种方式SAX、Pull、Dom

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),本文对android解析xml的这三种
2022-06-06

详解Android之解析XML文件三种方式(DOM,PULL,SAX)

1.xml文件代码 <%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncodi
2022-06-06

Android之PULL、SAX、DOM解析XML

背景:解析天气预报的xml文件,在模拟器显示 解析前准备 layout目录下weather.xml需要解析的文件:raw目录下的weather1.xml20℃/30℃晴天多云上海801级26℃/32℃晴天北京983级15℃/24℃多云广州3
2022-06-06

Android编程解析XML方法详解(SAX,DOM与PULL)

本文实例讲述了Android编程解析XML方法。分享给大家供大家参考,具体如下: XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一
2022-06-06

Android创建与解析XML(三)——详解Sax方式

1. Sax概述 SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义
2022-06-06

Android XML数据的三种解析方式

本篇文章包含以下内容: XML数据的Dom解析 XML数据的Sax解析 XML数据的Pull解析 Activity中使用三种解析 Sax解析与Pull解析区别三种解析方式的步骤: 1.在As
2022-06-06

Android基于Pull方式解析xml的方法详解

本文实例讲述了Android基于Pull方式解析xml的方法。分享给大家供大家参考,具体如下: Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。
2022-06-06

Python通过DOM和SAX方式解析XML的应用实例分享

XML.DOM 需求 有一个表,里面数据量比较大,每天一更新,其字段可以通过xml配置文件进行配置,即,可能每次建表的字段不一样。 上游跑时会根据配置从源文件中提取,到入库这一步需要根据配置进行建表。 解决 写了一个简单的xml,配置需要字
2022-06-04

Android 创建与解析XML(四)——详解Pull方式

1、Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSe
2022-06-06

Android中怎么使用pull方式解析xml格式文件

这篇文章将为大家详细讲解有关Android中怎么使用pull方式解析xml格式文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体如下:
2023-05-30

Android创建与解析XML(二)——详解Dom方式

1. Dom概述 Dom方式创建XML,应用了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML 文档,需要导入以下内容javax.xml.parsers javax.xml.parsers
2022-06-06

Android中使用sax解析xml文件的方法

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语
2022-06-06

Android 使用Pull方法解析XML文件的方法

Pull解析方法给应用程序完全的控制文档该怎么样被解析。Android中对Pull方法提供了支持的API,主要是 代码如下:org.xmlpull.v1.XmlPullParser;org.xmlpull.v1.XmlPullParserF
2022-06-06

Android中使用PULL方式解析XML文件深入介绍

一、基本介绍 Android中极力推荐xmlpull方式解析xml。 xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自己获取xmlpull所依赖的类库,kxml2-2.3.0.jar,xmlpul
2022-06-06

实例解析Android中使用Pull解析器解析XML的方法

1.Pull简介 Pull解析器是Android系统内置的的,Pull解析器与SAX解析器类似,他提供了类似的事件,如开始元素和介绍元素的事件,使用parser.next()可以进入下一个元素并触发相应的事件,然后进行相应的处理,当元素开始
2022-06-06

Android编程使用sax解析xml数据的方法详解

本文实例讲述了Android编程使用sax解析xml数据的方法。分享给大家供大家参考,具体如下:随着技术的发展,现在的web已经和以前不同了。web已经逐渐像移动的方向倾斜,作为程序员的确应该拓展一下自己的知识层面。学习各方面的知识,今天就
2023-05-30

android开发基础教程—三种方式实现xml文件解析

1.sax方式 代码如下: public class SaxParse{ private SAXParser parser; public SaxParse(){ try
2022-06-06

Android平台基于Pull方式对XML文件解析与写入方法详解

本文详细讲述了Android平台基于Pull方式对XML文件解析与写入方法。分享给大家供大家参考,具体如下: XML技术在跨平台的情况下的数据交互中得到了广泛的应用,假如我们需要开发一个Android应用程序,需要同服务器端进行数据交互,通
2022-06-06

Android开发之DOM解析xml文件的方法

本文实例讲述了Android中DOM解析xml文件的方法。分享给大家供大家参考,具体如下: 一、在assets文件中写xml文件
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录