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

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
xmlReader.setContentHandler(mRSSHandler);
xmlReader.parse(new InputSource(mStream));

这里要说明的是sax使用的工厂设计模式,通过SAXParserFactory 获取解析器parser ,在从解析器中获得解析xml文件的xmlReader
,但是在xmlReader
读取流式的xml文件时,需要完成一个RSSHandler的设置,RSSHandler是继承的DefaultHandler,所以这篇文章着重详解使用sax解析xml文件的DefaultHandler处理类。这里我以解析网站的rss.xml文件为例,下面我们先看rss.xml的文件格式:

xml/html代码:

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
<item>
<title>Ubuntu11.04(10.04)安装dos工具dosemu</title>
<link>http://www.ourunix.org/post/276.html</link>
<author>ourunix@163.com (walfred)</author>
<category>玩转Linux</category>
<pubDate>Mon, 16 Jan 2012 22:54:53 +0800</pubDate>
<comments />
<description>看完介绍之后,发现这是继wine之后的有一款linux类win工具了,所以现在直接上文介绍dosemu在ubuntu Linux上的安装步骤及使用其运行dos游戏:魂斗罗~~~</description>
</item>
</channel>
</rss>

RSSHandler继承的DefaultHandler处理类就是专门来解析这个文件的,看下我们必须完成的接口:

public void startDocument () {
//开始解析文档
} public void endDocument () {
//文档解析结束
} public void startElement (String uri, String localName, String qName, Attributes attributes) {
//开始解析节点
} public void characters (char[] ch, int start, int length) {
//保存节点内容
} public void endElement (String uri, String localName, String qName) {
//结束解析节点
}

一般前两个方法,开始解析和结束解析文档的不需要做处理外,我们的所有操作都是在解析节点部分,我们调用startElement
开始解析节点,然后调用characters 保存节点的内容,最后调用endElement ,如此循环而已,可以看下解析rss的示例:

public class RSSHandler extends DefaultHandler {
private Context mContext;
private RSSItem mRSSItem;
private RSSDBInterface mRSSDBInterface; private final int TITLE_STATE = 1;
private final int AUTHOR_STATE = 2;
private final int LINK_STATE = 3;
private final int DESCRIPTION_STATE = 4;
private final int CATEGORY_STATE = 5;
private final int PUBDATE_STATE = 6; //标记当前节点
private int currentState; public RSSHandler(Context ctx){
mContext = ctx;
//初始化当前节点标记为0
currentState = 0;
//数据库接口
mRSSDBInterface = new RSSDBInterface(mContext);
} public void startDocument () {
//开始解析文档
mRSSItem = new RSSItem();
} public void endDocument () {
//文档解析结束
} public void startElement (String uri, String localName, String qName, Attributes attributes) {
//开始解析节点
if (localName.equals("channel")){
return ;
} if (localName.equals("item")){
//当遇到一个item节点时,就实例化一个RSSItem对象
mRSSItem = new RSSItem();
return;
} if (localName.equals("title")){
currentState = TITLE_STATE;
return ;
} if (localName.equals("author")){
currentState = AUTHOR_STATE;
return ;
} if (localName.equals("description")){
currentState = DESCRIPTION_STATE;
return ;
} if (localName.equals("link")){
currentState = LINK_STATE;
return ;
} if (localName.equals("category")){
currentState = CATEGORY_STATE;
return ;
} if (localName.equals("pubDate")){
currentState = PUBDATE_STATE;
return ;
}
} public void endElement (String uri, String localName, String qName) {
//这是节点解析完成时调用的,这里我们遇到item的时候才调用下面的
if(localName.equals("item" && mRSSItem != null)){
ContentValues values = new ContentValues();
values.put(RSSDBInfo.Columns._TITLE, mRSSItem.getTitle());
values.put(RSSDBInfo.Columns._AUTHOR, mRSSItem.getAuthor());
values.put(RSSDBInfo.Columns._CATEGORY, mRSSItem.getCategory());
values.put(RSSDBInfo.Columns._DESCRIPTION, mRSSItem.getDescription());
values.put(RSSDBInfo.Columns._LINK, mRSSItem.getLink());
values.put(RSSDBInfo.Columns._PUBDATE, mRSSItem.getPubdate());
values.put(RSSDBInfo.Columns._ISREAD, RSSUtils.ARTICALE_UNREAD);
mRSSDBInterface.insertRSStoDB(values);
}
} public void characters (char[] ch, int start, int length) {
String theString = new String(ch, start, length);
switch(currentState){
case TITLE_STATE:
mRSSItem.setTitle(theString);
currentState = 0;
break; case AUTHOR_STATE:
mRSSItem.setAuthor(theString);
currentState = 0;
break; case LINK_STATE:
mRSSItem.setLink(theString);
currentState = 0;
break; case DESCRIPTION_STATE:
mRSSItem.setDescription(theString);
currentState = 0;
break; case CATEGORY_STATE:
mRSSItem.setCategory(theString);
currentState = 0;
break; case PUBDATE_STATE:
mRSSItem.setPubdate(theString);
currentState = 0;
break;
}
}
}

  这就SAX的工厂模式的解析。

注释:ContentValues 是类似Map一样的类,存储键值的。

   InputSource 主要就是用的解析的输入流列。

sax解析xml文件的DefaultHandler处理类的更多相关文章

  1. 用SAX解析xml文件,java

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

  2. JAVA使用SAX解析XML文件

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

  3. SAX解析xml文件

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

  4. 安卓SAX解析XML文件

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

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

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

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

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

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

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

  8. Java中实现SAX解析xml文件到MySQL数据库

    大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...

  9. 使用SAX解析XML文件

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

随机推荐

  1. POJ 3130

    这题,加了精度错了,不加精度反而对了... #include <iostream> #include <cstdio> #include <cstring> #in ...

  2. POJ 1673

    可以证明O是三角形ABC的垂心. 作图辅助线,一个很重要的技巧是延长中线等中线. 可以证明三角形DNA全等于ABC.然后通过角度变换容易证明AQ垂直于BC. #include <iostream ...

  3. POJ 1066

    由于到达点时不能绕墙,因为这是无意义的,所以,两点间的最小墙依然是按照直线所穿过的墙计算. #include <iostream> #include <cstdio> #inc ...

  4. Java使用JAVE获取MP4播放时长

  5. no projects are found to import

    从svn上导出的项目在导入Eclipse中常常出现 no projects are found to import . 产生的原因是:项目文件里中没有".classpath"和&q ...

  6. dlopen failed: empty/missing DT_HASH in &quot;libx.so&quot; (built with --hash-style=gnu?)

    崩溃日志内容: java.lang.UnsatisfiedLinkError: dlopen failed: empty/missing DT_HASH in "libxxxx.so&quo ...

  7. Spring+EhCache缓存实例(具体解说+源代码下载)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有高速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  8. Battle City

    Battle City Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7208   Accepted: 2427 Descr ...

  9. Node.js:教程

    ylbtech-Node.js:教程 1.返回顶部 1. Node.js 教程 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaS ...

  10. Several Ideas on Perl List Context

    According to Beginning Perl Book published by Tsinghua Pub., the list context appears when you are t ...