android 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/html代碼:
Ubuntu11.04(10.04)安裝dos工具dosemuhttp://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处理类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android string数字字符串如
- 下一篇: 计算机应用基础山东省,2019年山东省中