一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作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代码:

Ubuntu11.04(10.04)安装dos工具dosemu

http://www.ourunix.org/post/276.html

ourunix@163.com (walfred)

玩转Linux

Mon, 16 Jan 2012 22:54:53 +0800

看完介绍之后,发现这是继wine之后的有一款linux类win工具了,所以现在直接上文介绍dosemu在ubuntu Linux上的安装步骤及使用其运行dos游戏:魂斗罗~~~

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

public voidstartDocument () {//开始解析文档

}public voidendDocument () {//文档解析结束

}public voidstartElement (String uri, String localName, String qName, Attributes attributes) {//开始解析节点

}public void characters (char[] ch, int start, intlength) {//保存节点内容

}public voidendElement (String uri, String localName, String qName) {//结束解析节点

}

一般前两个方法,开始解析和结束解析文档的不需要做处理外,我们的所有操作都是在解析节点部分,我们调用startElement

开始解析节点,然后调用characters 保存节点的内容,最后调用endElement ,如此循环而已,可以看下解析rss的示例:

public class RSSHandler extendsDefaultHandler {privateContext mContext;privateRSSItem mRSSItem;privateRSSDBInterface 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 intcurrentState;publicRSSHandler(Context ctx){

mContext=ctx;//初始化当前节点标记为0

currentState = 0;//数据库接口

mRSSDBInterface = newRSSDBInterface(mContext);

}public voidstartDocument () {//开始解析文档

mRSSItem = newRSSItem();

}public voidendDocument () {//文档解析结束

}public voidstartElement (String uri, String localName, String qName, Attributes attributes) {//开始解析节点

if (localName.equals("channel")){return;

}if (localName.equals("item")){//当遇到一个item节点时,就实例化一个RSSItem对象

mRSSItem = newRSSItem();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 voidendElement (String uri, String localName, String qName) {//这是节点解析完成时调用的,这里我们遇到item的时候才调用下面的

if(localName.equals("item" && mRSSItem != null)){

ContentValues values= newContentValues();

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, intlength) {

String theString= newString(ch, start, length);switch(currentState){caseTITLE_STATE:

mRSSItem.setTitle(theString);

currentState= 0;break;caseAUTHOR_STATE:

mRSSItem.setAuthor(theString);

currentState= 0;break;caseLINK_STATE:

mRSSItem.setLink(theString);

currentState= 0;break;caseDESCRIPTION_STATE:

mRSSItem.setDescription(theString);

currentState= 0;break;caseCATEGORY_STATE:

mRSSItem.setCategory(theString);

currentState= 0;break;casePUBDATE_STATE:

mRSSItem.setPubdate(theString);

currentState= 0;break;

}

}

}

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

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

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

android xml defaulthandler解析,sax解析xml文件的DefaultHandler处理类相关推荐

  1. Java:XML之JavaSE SAX解析

    XML之JavaSE SAX解析 概述 SAX(Simple API For XML)是一个公共的基于事件的XML文档解析标准,能够通过一个简单的.快速的方法来对XML文档进行处理,和DOM相比它所占 ...

  2. Android学习笔记---android平台中利用,SAX解析xml

    1.SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺 序解析文档的过程中 ...

  3. Android开发--详解SAX解析XML文件

    SAX技术字处理XML文件时并不是一次性把XML文件装入内存,而是一边读一边解析,因此,在解析的过程中会有几个步骤需要注意,在这里用一张图来表示解析的步骤: 在本实例中,定义了一个xml文件,其中有若 ...

  4. DBLP数据集XML使用python SAX解析 作者名字显示错误问题

    问题描述 最近在做实验时处理DBLP XML数据集时,作者名字部分显示不全,比如一些带有特殊符号的作者Michael H. Böhlen解析完后就会变成Michael H. Böhlen.这样会导致一 ...

  5. [120_移动开发Android]007_android开发之SAX操作XML文件

    见如下个人学习笔记: http://wenku.baidu.com/view/893aa85d3b3567ec102d8a74?fr=prin 转载于:https://www.cnblogs.com/ ...

  6. SAX 解析XML文件:将XML转换成Java对象

    本博客介绍的是解析本地XML文件,解析网络上的XML 本文写得比较简略,实际上项目应用更多的是解析网上的xml资源 使用SAX 处理XML需要一个Handler 对象,一般继承org.xml.sax, ...

  7. XML解析(一),SAX解析XML

    转载自  XML解析(一),SAX解析XML 一.概述  SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM ...

  8. java对xml文件的解析_Java对XML文件的解析

    XML简介 围绕XML涉及到四方面的技术: 1.数据定义Schema.DTD 2.数据解析DOM.SAX两种解析模型 3.样式风格XSTL,使用XSTL可以将XML文件中存放的内容按照指定的样式显示为 ...

  9. XML的SAX解析以及DOM解析和SAX解析区别

    前言: XML解析工具 DOM解析原理:1)JAXP (oracle-Sun公司官方)2)JDOM工具(非官方)3)Dom4J工具(非官方)三大框架(默认读取xml的工具就是Dom4j)....... ...

最新文章

  1. 摆动排序leetcode324
  2. 日志系统的设计与实现_it运维管理系统|综合运维的设计与实现
  3. Android中设置组件多进程
  4. 互联网协议 — 使用 Wireshark 调试 HTTPS 及 HTTP/2 流量
  5. Machine Learning week 9 quiz: programming assignment-Anomaly Detection and Recommender Systems
  6. 【Linux系统编程】 Linux系统调用概述
  7. 二叉树数据结构和算法
  8. css li 空隙问题
  9. Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量
  10. 52 - 算法 - 数据结构 vector
  11. 安装ubuntu后需要做的事
  12. 浅析RTB和RTA(二)
  13. json在线格式化【推荐】
  14. EF里查看/修改实体的当前值、原始值和数据库值
  15. ReactiveSwift源码解析(二) Bag容器的代码实现
  16. java加解密之DES多种使用方式
  17. 用c语言编写一个简易计算器
  18. Rime输入法第三方词库配置
  19. html命名锚记链接失败,命名锚记(设置命名锚记超级链接)
  20. 原来MAC地址还是要购买的

热门文章

  1. 核弹级漏洞,把 log4j 扒给你看!
  2. 拯救运维工程师,数据链 DNA 来袭!
  3. 云原生人物志 | Pulsar翟佳:社区的信任最重要
  4. 拿来就能用!行,这本 Python 书彻底火了!
  5. 大数据里的婚姻:婚后两年,出轨高峰……
  6. axure中出现小手_你所不知道的15个Axure使用技巧
  7. 前端vue里面点击加载更多_vue 原生添加滚动加载更多
  8. js获取数组中最大和最小值
  9. RuoYi-Cloud 部署篇_03(linux环境 Mysql+nginx版本)
  10. Sublime Text 3 快捷键总结(详细版本)