私は千年の歳月をかけて、数え切れないほどの時代の幕を開けました。穏やかで水っぽい日に会うために、そして生涯、生涯、美しい散文のために、お互いに親しくなりました。 「アンドロイドとして;)、xmlファイルを解析するためにsaxを使用することは、xmlを解析するために私が見た最も簡単な方法です。
SAXParserFactoryファクトリ= SAXParserFactory.newInstance(); SAXParserパーサー = factory.newSAXParser(); XMLReader xmlReader = parser.getXMLReader(); xmlReader.setContentHandler(mRSSHandler); xmlReader.parse(new InputSource(mStream));
ここで説明するのは、saxで使用されるファクトリデザインパターンです。パーサーはSAXParserFactoryを通じて取得され、xmlファイルを解析するxmlReaderはパーサーから取得されます。ただし、xmlReaderがストリーミングxmlファイルを読み取るときは、RSSHandlerの設定を完了する必要があります。 RSSHandlerは継承されたDefaultHandlerであるため、この記事では、saxを使用してxmlファイルを解析するDefaultHandler処理クラスの説明に焦点を当てます。ここでは、Webサイトのrss.xmlファイルの解析を例にとります。まず、rss.xmlのファイル形式を見てみましょう。
<?xml version = "1.0" encoding = "utf-8" ?> < rss version = "2.0" > < チャネル> < アイテム> < タイトル> Ubuntu11.04(10.04)安装dosツールdosemu </ タイトル> < リンク> http ://www.ourunix.org/post/276.html </ link > < author > [email protected](walfred)</ author > < category >玩转Linux </ category > <2012年1月16日月曜日22:54:53 +0800 </ pubDate > < コメント/> < 説明> 概要を読んだ後、これはLinuxのようなワインの後のwinツールであることがわかりました。 ubuntu Linuxでのインストール手順とそれを使用してDOSゲームを実行する:反対~~~ </ 説明> </ アイテム> </ チャンネル> </ rss >
R SSHandlerによって継承されたDefaultHandler処理クラスは、このファイルを解析するように特別に設計されています。完了する必要があるインターフェースを見てみましょう。
public void startDocument(){ // ドキュメントの解析開始 } public void endDocument(){ // ドキュメントの解析終了 } public void startElement(String uri、String localName、String qName、Attributes attributes){ // 解析ノードの開始 } public void文字(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; ケースDESCRIPTION_STATE: mRSSItem.setDescription(theString); currentState = 0 ; 休憩; ケースCATEGORY_STATE: mRSSItem.setCategory(theString); currentState = 0 ; 休憩; ケースPUBDATE_STATE: mRSSItem.setPubdate(theString); currentState = 0 ; 休憩; } }
}
転載:http://www.cnblogs.com/chenying99/archive/2013/05/14/3077014.html