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

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

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

xml/html代码:

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

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

  1. public void startDocument () {
  2. //开始解析文档
  3. }
  4.  
  5. public void endDocument () {
  6. //文档解析结束
  7. }
  8.  
  9. public void startElement (String uri, String localName, String qName, Attributes attributes) {
  10. //开始解析节点
  11. }
  12.  
  13. public void characters (char[] ch, int start, int length) {
  14. //保存节点内容
  15. }
  16.  
  17. public void endElement (String uri, String localName, String qName) {
  18. //结束解析节点
  19. }

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

  1. public class RSSHandler extends DefaultHandler {
  2. private Context mContext;
  3. private RSSItem mRSSItem;
  4. private RSSDBInterface mRSSDBInterface;
  5.  
  6. private final int TITLE_STATE = 1;
  7. private final int AUTHOR_STATE = 2;
  8. private final int LINK_STATE = 3;
  9. private final int DESCRIPTION_STATE = 4;
  10. private final int CATEGORY_STATE = 5;
  11. private final int PUBDATE_STATE = 6;
  12.  
  13. //标记当前节点
  14. private int currentState;
  15.  
  16. public RSSHandler(Context ctx){
  17. mContext = ctx;
  18. //初始化当前节点标记为0
  19. currentState = 0;
  20. //数据库接口
  21. mRSSDBInterface = new RSSDBInterface(mContext);
  22. }
  23.  
  24. public void startDocument () {
  25. //开始解析文档
  26. mRSSItem = new RSSItem();
  27. }
  28.  
  29. public void endDocument () {
  30. //文档解析结束
  31. }
  32.  
  33. public void startElement (String uri, String localName, String qName, Attributes attributes) {
  34. //开始解析节点
  35. if (localName.equals("channel")){
  36. return ;
  37. }
  38.  
  39. if (localName.equals("item")){
  40. //当遇到一个item节点时,就实例化一个RSSItem对象
  41. mRSSItem = new RSSItem();
  42. return;
  43. }
  44.  
  45. if (localName.equals("title")){
  46. currentState = TITLE_STATE;
  47. return ;
  48. }
  49.  
  50. if (localName.equals("author")){
  51. currentState = AUTHOR_STATE;
  52. return ;
  53. }
  54.  
  55. if (localName.equals("description")){
  56. currentState = DESCRIPTION_STATE;
  57. return ;
  58. }
  59.  
  60. if (localName.equals("link")){
  61. currentState = LINK_STATE;
  62. return ;
  63. }
  64.  
  65. if (localName.equals("category")){
  66. currentState = CATEGORY_STATE;
  67. return ;
  68. }
  69.  
  70. if (localName.equals("pubDate")){
  71. currentState = PUBDATE_STATE;
  72. return ;
  73. }
  74. }
  75.  
  76. public void endElement (String uri, String localName, String qName) {
  77. //这是节点解析完成时调用的,这里我们遇到item的时候才调用下面的
  78. if(localName.equals("item" && mRSSItem != null)){
  79. ContentValues values = new ContentValues();
  80. values.put(RSSDBInfo.Columns._TITLE, mRSSItem.getTitle());
  81. values.put(RSSDBInfo.Columns._AUTHOR, mRSSItem.getAuthor());
  82. values.put(RSSDBInfo.Columns._CATEGORY, mRSSItem.getCategory());
  83. values.put(RSSDBInfo.Columns._DESCRIPTION, mRSSItem.getDescription());
  84. values.put(RSSDBInfo.Columns._LINK, mRSSItem.getLink());
  85. values.put(RSSDBInfo.Columns._PUBDATE, mRSSItem.getPubdate());
  86. values.put(RSSDBInfo.Columns._ISREAD, RSSUtils.ARTICALE_UNREAD);
  87. mRSSDBInterface.insertRSStoDB(values);
  88. }
  89. }
  90.  
  91. public void characters (char[] ch, int start, int length) {
  92. String theString = new String(ch, start, length);
  93. switch(currentState){
  94. case TITLE_STATE:
  95. mRSSItem.setTitle(theString);
  96. currentState = 0;
  97. break;
  98.  
  99. case AUTHOR_STATE:
  100. mRSSItem.setAuthor(theString);
  101. currentState = 0;
  102. break;
  103.  
  104. case LINK_STATE:
  105. mRSSItem.setLink(theString);
  106. currentState = 0;
  107. break;
  108.  
  109. case DESCRIPTION_STATE:
  110. mRSSItem.setDescription(theString);
  111. currentState = 0;
  112. break;
  113.  
  114. case CATEGORY_STATE:
  115. mRSSItem.setCategory(theString);
  116. currentState = 0;
  117. break;
  118.  
  119. case PUBDATE_STATE:
  120. mRSSItem.setPubdate(theString);
  121. currentState = 0;
  122. break;
  123. }
  124. }
  125. }

  这就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. 用hadoop实现SimRank++算法(1)----权值转移矩阵的计算

    本文主要针对广告检索领域的查询重写应用,依据查询-广告点击二部图,在MapReduce框架上实现SimRank++算法.关于SimRank++算法的背景和原理请參看前一篇文章<基于MapRedu ...

  2. declare-styleable的使用

    declare-styleable:declare-styleable是给自定义控件添加自定义属性用的. 1.首先,先写attrs.xml 在res-vlaues文件夹下创建资源文件attrs.xml ...

  3. [转]详细解读TrueSkill 排名系统

    概要 大多数竞技游戏都有一个评价玩家是否完成目标的度量指标,它是游戏的基础.对于包含两个或两个以上玩家(多玩家比赛)的比赛,常涉及到游戏玩家技能的排名方法.游戏鼓励玩家之间相互竞争,玩家不只要赢得单场 ...

  4. java使用FileUtils文件操作神器

    前言: 在工作当中我们往往遇到很多文件的操作,我们也习惯写一些自己定义的工具类来简化文件操作,其实apache的commons的FileUtils类就是这样一个工具类,使用它能大大的简化我们对文件的操 ...

  5. RMS:均方根值,RMSE:均方根误差,MSE:标准差

    .均方根值(RMS),有时也称方均根.效值.英语写为:Root Mean Square(RMS). 美国传统词典的定义为:The square root of the average of squar ...

  6. HBase编程 API入门系列之HTable pool(6)

    HTable是一个比较重的对此,比如加载配置文件,连接ZK,查询meta表等等,高并发的时候影响系统的性能,因此引入了“池”的概念. 引入“HBase里的连接池”的目的是: 为了更高的,提高程序的并发 ...

  7. 根据项目类型导入Excel文件到不同数据库

    前提:如果您要针对不同的业务做数据导入,可以参考下这个项目,这个项目的原理就是根据文件名进行区分,然后导入不同的数据表.下面我就写个Demo演示下: 学生表-- 主键,学生姓名,学生年龄,学校归属 教 ...

  8. nginx 集群简述

    1.负载均衡介绍: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.其工作模式为将外部发送来的请求均匀分配到对称结构中的 ...

  9. Splay树

    class SplayNode { public: SplayNode *child[]; char value; int size; bool flip; SplayNode(), flip(fal ...

  10. HDFS与java API应用

    java代码操作hadoop文件需要用hadoop的jar包,comment,hdfs,yarn,mapreduce,内均有有关jar包,eclipse操作hadoop还需要配置core-site.x ...