国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

詳解使用sax解析xml文件的DefaultHandler處理類

2019-11-09 18:42:37
字體:
來源:轉載
供稿:網友

一千年的時光,我無數次掀起歲月的帷幔,只為和你,在某一個平靜如水的日子相遇,然后相識,傾情一生,繾綣一世,好美的散文,好吧,我情愿把這個“你”當作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;          }      }  

}

轉載來自于:http://www.cnblogs.com/chenying99/archive/2013/05/14/3077014.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灯塔市| 始兴县| 洪雅县| 昌都县| 岢岚县| 新宁县| 滦平县| 伊金霍洛旗| 广饶县| 兴义市| 绥德县| 泰来县| 仙居县| 海安县| 宁晋县| 麦盖提县| 江西省| 大余县| 定远县| 朝阳区| 房产| 安塞县| 绥中县| 吉隆县| 浑源县| 孝义市| 松原市| 蒙自县| 和龙市| 湖南省| 民县| 焦作市| 玉龙| 元朗区| 景洪市| 永安市| 昭平县| 屏山县| 株洲市| 郓城县| 独山县|