sax解析xml文件的DefaultHandler处理类
一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作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处理类的更多相关文章
- 用SAX解析xml文件,java
(此文为(https://www.imooc.com/video/4482)之随笔) 1.用SAX解析xml文件大致分为三步 写了一个XML文件作为例子 (1)main方法代码如下: import j ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- SAX解析xml文件
需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...
- 安卓SAX解析XML文件
XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...
- cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)
今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...
- Python—使用xml.sax解析xml文件
什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...
- sax解析xml文件,封装到对象中
创建User.java类 public class User { private String id; private String name; private String age; private ...
- Java中实现SAX解析xml文件到MySQL数据库
大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...
- 使用SAX解析XML文件
SAX这是Simple API for XML缩写,它不是由引起W3C拟议标准正式.尽管如此,使用SAX很少几个,点儿全部的XML解析器都会支持它. 与DOM比較而言,SAX是一种轻量型的方法. 我们 ...
随机推荐
- 用hadoop实现SimRank++算法(1)----权值转移矩阵的计算
本文主要针对广告检索领域的查询重写应用,依据查询-广告点击二部图,在MapReduce框架上实现SimRank++算法.关于SimRank++算法的背景和原理请參看前一篇文章<基于MapRedu ...
- declare-styleable的使用
declare-styleable:declare-styleable是给自定义控件添加自定义属性用的. 1.首先,先写attrs.xml 在res-vlaues文件夹下创建资源文件attrs.xml ...
- [转]详细解读TrueSkill 排名系统
概要 大多数竞技游戏都有一个评价玩家是否完成目标的度量指标,它是游戏的基础.对于包含两个或两个以上玩家(多玩家比赛)的比赛,常涉及到游戏玩家技能的排名方法.游戏鼓励玩家之间相互竞争,玩家不只要赢得单场 ...
- java使用FileUtils文件操作神器
前言: 在工作当中我们往往遇到很多文件的操作,我们也习惯写一些自己定义的工具类来简化文件操作,其实apache的commons的FileUtils类就是这样一个工具类,使用它能大大的简化我们对文件的操 ...
- RMS:均方根值,RMSE:均方根误差,MSE:标准差
.均方根值(RMS),有时也称方均根.效值.英语写为:Root Mean Square(RMS). 美国传统词典的定义为:The square root of the average of squar ...
- HBase编程 API入门系列之HTable pool(6)
HTable是一个比较重的对此,比如加载配置文件,连接ZK,查询meta表等等,高并发的时候影响系统的性能,因此引入了“池”的概念. 引入“HBase里的连接池”的目的是: 为了更高的,提高程序的并发 ...
- 根据项目类型导入Excel文件到不同数据库
前提:如果您要针对不同的业务做数据导入,可以参考下这个项目,这个项目的原理就是根据文件名进行区分,然后导入不同的数据表.下面我就写个Demo演示下: 学生表-- 主键,学生姓名,学生年龄,学校归属 教 ...
- nginx 集群简述
1.负载均衡介绍: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.其工作模式为将外部发送来的请求均匀分配到对称结构中的 ...
- Splay树
class SplayNode { public: SplayNode *child[]; char value; int size; bool flip; SplayNode(), flip(fal ...
- HDFS与java API应用
java代码操作hadoop文件需要用hadoop的jar包,comment,hdfs,yarn,mapreduce,内均有有关jar包,eclipse操作hadoop还需要配置core-site.x ...