详解使用sax解析xml文件的DefaultHandler处理类(转载)

前端之家收集整理的这篇文章主要介绍了详解使用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 version="1.0" encoding="utf-8" ?>       
<RSS version="2.0">      
channelitemtitle>Ubuntu11.04(10.04)安装dos工具dosemu</>       
link>http://www.ourunix.org/post/276.htmlauthor>ourunix@163.com (walfred)category>玩转LinuxpubDate>Mon,16 Jan 2012 22:54:53 +0800comments />       
description>看完介绍之后,发现这是继wine之后的有一款linux类win工具了,所以现在直接上文介绍dosemu在ubuntu Linux上的安装步骤及使用其运行dos游戏:魂斗罗~~~RSS>   

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

public void startDocument () {  
        //开始解析文档  
    }  
  
    void endDocument () {  
        文档解析结束  
    }  
  
    void startElement (String uri,String localName,String qName,Attributes attributes) {  
        开始解析节点  
    }  
      
    void characters (char[] ch,int start,255); line-height:1.5!important">int length) {  
        保存节点内容  
    }  
      
    void endElement (String uri,String qName) {  
        结束解析节点  
    }  

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

class RSSHandler extends DefaultHandler { private Context mContext; private RSSItem mRSSItem; private RSSDBInterface mRSSDBInterface; private final int TITLE_STATE = 1; int AUTHOR_STATE = 2; int LINK_STATE = 3; int DESCRIPTION_STATE = 4; int CATEGORY_STATE = 5; int PUBDATE_STATE = 6; 标记当前节点 int currentState; public RSSHandler(Context ctx){ mContext = ctx; 初始化当前节点标记为0 currentState = 0; 数据库接口 mRSSDBInterface = new RSSDBInterface(mContext); } 开始解析文档 mRSSItem = new RSSItem(); } 开始解析节点 if (localName.equals("channel")){ return ; } if (localName.equals("item")){ 当遇到一个item节点时,就实例化一个RSSItem对象 mRSSItem = new RSSItem(); return; } if (localName.equals("title")){ currentState = TITLE_STATE; if (localName.equals("author")){ currentState = AUTHOR_STATE; if (localName.equals("description")){ currentState = DESCRIPTION_STATE; if (localName.equals("link")){ currentState = LINK_STATE; if (localName.equals("category")){ currentState = CATEGORY_STATE; if (localName.equals("pubDate")){ currentState = PUBDATE_STATE; return ; } } 这是节点解析完成时调用的,这里我们遇到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); } } 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; case LINK_STATE: mRSSItem.setLink(theString); currentState = 0; case DESCRIPTION_STATE: mRSSItem.setDescription(theString); currentState = 0; case CATEGORY_STATE: mRSSItem.setCategory(theString); currentState = 0; case PUBDATE_STATE: mRSSItem.setPubdate(theString); currentState = 0; break; } } }

猜你在找的XML相关文章