XML文件经常使用的解析方式有DOM解析,SAX解析。

一、Sax

SAX(simpleAPIforXML)是一种XML解析的替代方法。

相比于DOM。SAX是一种速度更快,更有效的方法。

它逐行扫描文档。一边扫描一边解析。

并且相比于DOM。SAX能够在解析文档的随意时刻停止解析,但不论什么事物都有其相反的一面,对于SAX来说就是操作复杂。

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

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

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

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

实现一个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节点后,运行这种方法。


//设置一个能够定位文档内容事件发生位置的定位器对象

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();
---能够不要reader将第五步改动为parser.parse(xmlfile。handler);

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

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

(五)第五步:将一个xml文档或者资源变成一个

q=java&ie=utf-8&src=se_lighten_f" style="margin:0px; padding:0px; color:rgb(0,0,240); display:inline; position:static">java能够处理的

q=InputStream&ie=utf-8&src=se_lighten_f" style="margin:0px; padding:0px; color:rgb(0,0,240); display:inline; position:static">InputStream流后,解析正式開始,代码例如以下:

reader.parse(inputstream);

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

详细例如以下所看到的:

 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("xmlFile.xml"));//取得本地xml文件
reader.parse(is);

或者:
 	   SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();

RSSHandler handler = new RSSHandler();

reader.parse(xmlFile,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>

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

以下就是最最重要的地方了,建立自己的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{

String currentTag;
    String currentValue;
     
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}

@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
	currentTag=localName;
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
           currentTag=localName;

}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub

        currentValue = new String(ch, start, length).trim();//从当前 String 对象移除全部前导空白字符和尾部空白字符。
//操作
}
}
开启解析仅仅须要依据上面步骤进行就可以。

安卓SAX解析XML文件的更多相关文章

  1. JAVA使用SAX解析XML文件

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

  2. 用SAX解析xml文件,java

    (此文为(https://www.imooc.com/video/4482)之随笔) 1.用SAX解析xml文件大致分为三步 写了一个XML文件作为例子 (1)main方法代码如下: import j ...

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

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

  4. SAX解析xml文件

    需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...

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

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

  6. Python—使用xml.sax解析xml文件

    什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...

  7. android sax解析xml 文件 动态加载标题

    要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...

  8. 使用SAX解析XML文件

    SAX这是Simple API for XML缩写,它不是由引起W3C拟议标准正式.尽管如此,使用SAX很少几个,点儿全部的XML解析器都会支持它. 与DOM比較而言,SAX是一种轻量型的方法. 我们 ...

  9. sax解析xml文件,封装到对象中

    创建User.java类 public class User { private String id; private String name; private String age; private ...

随机推荐

  1. Flask的上下文管理机制

    前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...

  2. 2017 CCPC 湘潭邀请赛

    都tm快一年了我还没补这套题……再不补怕是要留给退役后乐 Problem A 把$n * (n + 1)$的矩阵补成$(n + 1) * (n + 1)$的,然后高斯消元. Problem B 一看题 ...

  3. python 字符串最长公共前缀

      编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&qu ...

  4. 模拟【P1650】 田忌赛马

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述--->p1650 田忌赛马 先%dalao sto GMPotlc orz 他教给的我,征求意见后终于来水题解. 分析 我们需要知 ...

  5. (寒假集训)Reordering the Cows

    Reordering the Cows 时间限制: 1 Sec  内存限制: 64 MB提交: 18  解决: 7[提交][状态][讨论版] 题目描述 Farmer John's N cows (1 ...

  6. Codeforces Round #325 (Div. 2) Laurenty and Shop 模拟

    原题链接:http://codeforces.com/contest/586/problem/B 题意: 大概就是给你一个两行的路,让你寻找一个来回的最短路,并且不能走重复的路. 题解: 就枚举上下选 ...

  7. iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑

    一.游戏界面涉及到的功能点 1)数独格子的建模 (1)绘制数独格子要考虑到标记功能 所以要在每个格子内预先塞入9个标记数字,仅数独格子算下来就有9*9*9=729个格子且存在大量嵌套(这导致我在操作S ...

  8. 玩转Nuget服务器搭建(二)

    之所以分开来写这几部分,是因为今天搭建的过程中,碰到了几个问题,特别提一下,让大家省下这部分时间(毕竟人生苦短嘛,你如果就是闲的蛋疼,请给我你的GUID,我送你几瓶风油精). NugetServer ...

  9. centos下mysql集群初尝试

    原文:http://www.lvtao.net/database/mysql-cluster.html 五台服务器篇 安装要求 安装环境:CentOS-6.3安装方式:源码编译安装软件名称:mysql ...

  10. Assembly.Load动态加载程序集而不占用文件 z

    方式一:占用文件的加载 Assembly assembly = Assembly.Load(path); 用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的d ...