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

详解android使用SAX解析XML文件

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

详解android使用SAX解析XML文件

解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。

DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了。

优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。

缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存,CPU)。

为了解决DOM解析存在的问题,就出现了SAX解析。其特点为:

优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如android,极力推荐使用SAX解析。

缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事件过后没有保存数据,数据就会丢失。

使用场合:机器有性能限制。

SAX解析XML文档采用事件驱动模式。什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。

基于事件驱动的处理模式主要是基于事件源和事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,他通过parse()方法开始解析XML文档,并根据文档内容产生事件。而事件处理器则是org.xml.sax包中的ContentHandler、DTDHandler、ErrorHandler,以及EntityResolver这四个接口。他们分别处理事件源在解析过程中产生不同类的事件(其中DTDHandler为解析文档DTD时所用)。详细介绍如下表:

在上述四个接口中,最重要的就是ContentHandler这个接口,下面是对这个接口方法的说明:


//设置一个可以定位文档内容事件发生位置的定位器对象
public void setDocumentLocator(Locator locator)
//用于处理文档解析开始事件
public void startDocument()throws SAXException
//处理元素开始事件,从参数中可以获得元素所在名称空间的uri,元素名称,属性类表等信息
public void startElement(String namespacesURI , String localName , String qName , Attributes atts) throws SAXException
//处理元素结束事件,从参数中可以获得元素所在名称空间的uri,元素名称等信息
public void endElement(String namespacesURI , String localName , String qName) throws SAXException
//处理元素的字符内容,从参数中可以获得内容
public void characters(char[] ch , int start , int length) throws SAXException

这里再介绍下XMLReader中的方法。


//注册处理XML文档解析事件ContentHandler
public void setContentHandler(ContentHandler handler)
//开始解析一个XML文档
public void parse(InputSorce input) throws SAXException

SAX实现实体解析的步骤:

在android中使用SAX是有迹可循的,完全可以按照下面的方法就可以轻松找到xml里的tag,然后得到想要的内容。具体实现步骤如下:

(一)第一步:新建一个工厂类SAXParserFactory,代码如下:


SAXParserFactory factory = SAXParserFactory.newInstance();

(二)第二步:让工厂类产生一个SAX的解析类SAXParser,代码如下:


SAXParser parser = factory.newSAXParser();

(三)第三步:从SAXPsrser中得到一个XMLReader实例,代码如下:


XMLReader reader = parser.getXMLReader();

(四)第四步:把自己写的handler注册到XMLReader中,一般最重要的就是ContentHandler,代码如下:


RSSHandler handler = new RSSHandler();
reader.setContentHandler(handler);

(五)第五步:将一个xml文档或者资源变成一个java可以处理的InputStream流后,解析正式开始,代码如下:


parser.parse(is);

上面几个步骤中,最重要、最关键的就是第四步,handler的实现。

下面通过一个RSS解析的例子说明handler的实现:

我们先是自己见一个rss的xml文档,实现本地解析,新建的rss文档如下:


<?xml version="1.0" encoding="UTF-8"?>
  <channel>
    <title>RSS 解析练习</title>
    <description>hehehaha</description>
    <link>http://www.cnblogs.com/felix-hua/</link>
    <language>zh-cn</language>
    <item>
      <title><![CDATA[头条]]></title>
      <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
      <category>0</category>
      <description>描述详细信息的</description>
      <pubDate>2012-01-09</pubDate>
    </item>
    <item>
      <title><![CDATA[新闻]]></title>
      <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
      <category>0</category>
      <description>描述详细信息的</description>
      <pubDate>2012-01-09</pubDate>
    </item>
    <item>
      <title><![CDATA[首页]]></title>
      <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
      <category>0</category>
      <description>描述详细信息的</description>
      <pubDate>2012-01-09</pubDate>
    </item>
    <item>
      <title><![CDATA[财经]]></title>
      <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
      <category>0</category>
      <description>描述详细信息的</description>
      <pubDate>2012-01-09</pubDate>
    </item>

建好后,我们命名为rssxml.xml,然后放到项目的根目录下:

然后我们可以建立两个实体类:

1、RSSFeed,与完整的xml文档相对应;

2、RSSItem,与item标签内的信息相对应。

这样在解析xml时,我们就可以把解析出来的信息放到实体类里,然后直接操作实体类就可以了。下面给出代码:

RSSFeed.java


package com.sax.org.entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
public class RSSFeed {
  private String title;
  private int itemcount;
  private List<RSSItem> itemlist;
  public RSSFeed(){
    itemlist = new Vector<RSSItem>(0);
  }
  
  public int addItem(RSSItem item){
    itemlist.add(item);
    itemcount++;
    return itemcount;
  }
  public RSSItem getItem(int location){
    return itemlist.get(location);
  }
  public List<RSSItem> getAllItems(){
    return itemlist;
  }
  
  public List getAllItemForListView(){
    List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
    int size = itemlist.size();
    for(int i=0 ; i<size ; i++){
      HashMap<String , Object> item = new HashMap<String, Object>();
      item.put(RSSItem.TITLE, itemlist.get(i).getTitle());
      item.put(RSSItem.PUBDATE, itemlist.get(i).getPubdate());
      data.add(item);
    }
    return data;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public int getItemcount() {
    return itemcount;
  }
  public void setItemcount(int itemcount) {
    this.itemcount = itemcount;
  }
  public List<RSSItem> getItemlist() {
    return itemlist;
  }
  public void setItemlist(List<RSSItem> itemlist) {
    this.itemlist = itemlist;
  }
}

RSSItem.java


package com.sax.org.entity;
public class RSSItem {
  public static String TITLE = "title";
  public static String PUBDATE = "pubdate";
  public String title;
  public String description;
  public String link;
  public String category;
  public String pubdate;
  public RSSItem() {
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public String getLink() {
    return link;
  }
  public void setLink(String link) {
    this.link = link;
  }
  public String getCategory() {
    return category;
  }
  public void setCategory(String category) {
    this.category = category;
  }
  public String getPubdate() {
    return pubdate;
  }
  public void setPubdate(String pubdate) {
    this.pubdate = pubdate;
  }
}

下面就是最最重要的地方了,建立自己的ContentHandler.看下面的代码:

RSSHandler.java


package com.sax.org.handler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.sax.org.entity.RSSFeed;
import com.sax.org.entity.RSSItem;
public class RSSHandler extends DefaultHandler{
  RSSFeed RssFeed;
  RSSItem RssItem;
  final int RSS_TITLE = 1;
  final int RSS_LINK = 2;
  final int RSS_DESCRIPTION = 3;
  final int RSS_CATEGORY = 4;
  final int RSS_PUBDATE = 5;
  int currentstate = 0;
  public RSSHandler(){}
  public RSSFeed getFeed(){
    return RssFeed;
  }
  @Override
  public void startDocument() throws SAXException {
    // TODO Auto-generated method stub
    RssFeed = new RSSFeed();
    RssItem = new RSSItem();
  }
  @Override
  public void endDocument() throws SAXException {
    // TODO Auto-generated method stub
  }
  @Override
  public void startElement(String uri, String localName, String qName,
      Attributes attributes) throws SAXException {
    // TODO Auto-generated method stub
    if(localName.equals("channel")){
      currentstate = 0;
      return;
    }
    if(localName.equals("item")){
      RssItem = new RSSItem();
      return;
    }
    if(localName.equals("title")){
      currentstate = RSS_TITLE;
      return;
    }
    if(localName.equals("description")){
      currentstate = RSS_DESCRIPTION;
      return;
    }
    if(localName.equals("link")){
      currentstate = RSS_LINK;
      return;
    }
    if(localName.equals("category")){
      currentstate = RSS_CATEGORY;
      return;
    }
    if(localName.equals("pubDate")){
      currentstate = RSS_PUBDATE;
      return;
    }
    currentstate = 0;
  }
  @Override
  public void endElement(String uri, String localName, String qName)
      throws SAXException {
    // TODO Auto-generated method stub
    if(localName.equals("item")){
      RssFeed.addItem(RssItem);
      return;
    }
  }
  @Override
  public void characters(char[] ch, int start, int length)
      throws SAXException {
    // TODO Auto-generated method stub
    String theString = new String(ch, start, length);
    switch(currentstate){
    case RSS_TITLE:
      RssItem.setTitle(theString);
      currentstate = 0;
      break;
    case RSS_DESCRIPTION:
      RssItem.setDescription(theString);
      currentstate = 0;
      break;
    case RSS_LINK:
      RssItem.setLink(theString);
      currentstate = 0;
      break;
    case RSS_PUBDATE:
      RssItem.setPubdate(theString);
      currentstate = 0;
      break;
    case RSS_CATEGORY:
      RssItem.setCategory(theString);
      currentstate = 0;
      break;
    default:
      return;
    }
  }
}

就上面的代码分析,实现一个ContentHandler一般要一下几个步骤:

1、声明一个类,继承DefaultHandler。DefaultHandler是一个基类,这个类里面简单实现了一个ContentHandler。我们只需要重写里面的方法即可。

2、重写 startDocument() 和 endDocument(),一般解析将正式解析之前的一些初始化工资放到startDocument()里面,收尾的工作放到endDocument()里面。

3、重写startElement(),XML解析器遇到XML里面的tag时就会调用这个函数。经常在这个函数内是通过localName俩进行判断而操作一些数据。

4、重写characters()方法,这是一个回调方法。解析器执行完startElement()后,解析完节点的内容后就会执行这个方法,并且参数ch[]就是节点的内容。这个例子里我们根据currentstate的不同,来判断当前那个tag的内容,并放到合适的实体类中。

5、重写endElement()方法,这个方法与startElement()相对应,解析完一个tag节点后,执行这个方法。再找个例子中,如果解析一个item结束,就将RSSIiem添加到RSSFeed中。

最后我们实现一个activity来展现解析的结果:


 package com.sax.org;
import java.io.IOException;
import java.net.URL;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.sax.org.entity.RSSFeed;
import com.sax.org.entity.RSSItem;
import com.sax.org.handler.RSSHandler;
public class SAXReaderActivity extends Activity {
  
  public String rssUrl = "http://mc.cz001.com.cn/a/indexconfig/index.rss";
  public RSSFeed feed;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    feed = getFeed(rssUrl);
    showList();
  }
  public RSSFeed getFeed(String rssUrl) {
    try {
// 这里我们实现了本地解析,所以注掉了这个取网络数据的。
//      URL url = new URL(rssUrl);
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser parser = factory.newSAXParser();
      XMLReader reader = parser.getXMLReader();
      RSSHandler handler = new RSSHandler();
      reader.setContentHandler(handler);
      InputSource is = new InputSource(this.getClassLoader().getResourceAsStream("rssxml.xml"));//取得本地xml文件
      reader.parse(is);
      return handler.getFeed();
    } 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 null;
  }
  public void showList() {
    ListView rsslistview = (ListView) findViewById(R.id.rssList);
    TextView rsstitle = (TextView) findViewById(R.id.rsstitle);
    if (feed == null) {
      rsstitle.setText("访问失败...");
      return;
    }
    SimpleAdapter adapter = new SimpleAdapter(this,
        feed.getAllItemForListView(),
        android.R.layout.simple_list_item_2, new String[] {
            RSSItem.TITLE, RSSItem.PUBDATE }, new int[] {
            android.R.id.text1, android.R.id.text2 });
    rsslistview.setAdapter(adapter);
  }
}

展示下运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

您可能感兴趣的文章:Android中使用sax解析xml文件的方法Android编程解析XML方法详解(SAX,DOM与PULL)Android创建与解析XML(三)——详解Sax方式Android解析XML的三种方式SAX、Pull、DomAndroid编程使用sax解析xml数据的方法详解详解Android之解析XML文件三种方式(DOM,PULL,SAX)Android利用SAX对XML进行增删改查操作详解


免责声明:

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

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

详解android使用SAX解析XML文件

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

下载Word文档

猜你喜欢

详解android使用SAX解析XML文件

解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。 DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了。 优点:整个文档读入内存,方便操作:支持修改、删除和
2022-06-06

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

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

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

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

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

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

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

流畅解析 XML:使用 Java 的 SAX API

使用 Java 的 SAX API 解析 XML
流畅解析 XML:使用 Java 的 SAX API
2024-03-07

怎么用Java结合SAX 2.0 解析XML文档

这篇文章主要为大家展示了“怎么用Java结合SAX 2.0 解析XML文档”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用Java结合SAX 2.0 解析XML文档”这篇文章吧。/*自从XM
2023-06-03

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

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

Android开发之XML文件解析的使用

前言 本文主要介绍在Android中怎样来解析XML文件。主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口。XML文件解析一般有2
2022-06-06

Android使用Pull解析器解析xml文件的实现代码

2个类:1个实体类Person.java,1个继承Activity的类 1.Person.java代码如下:package com.mrzhu.work_1_sax; public class Person { private Stri
2022-06-06

Android中怎么解析XML文件

本篇文章给大家分享的是有关Android中怎么解析XML文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。XMLXML(eXtensible Markup Language)中
2023-05-30

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

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

android编程之XML文件解析方法详解(附源码)

本文实例讲述了android编程之XML文件解析方法。分享给大家供大家参考,具体如下: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CS
2022-06-06

怎么使用dom4j解析xml文件

怎么使用dom4j解析xml文件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。DOM4J解析特征:1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示
2023-05-31

Android中使用pull解析器操作xml文件的解决办法

一、使用Pull解析器读取XML文件 除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。
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格式文件

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

编程热搜

  • 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第一次实验

目录