2011年12月28日 星期三

Android - xml 解析 (XmlPullParser)

某些需要從網站下載xml資料,進行解析的程式。個人建議將解析的流程寫在一個Service裡面,如此一來才不會影響使用者當下操作的畫面。當解析完畢時,再將所需的資料丟給所需要的Activity或是DB或是進行處理。下面程式利用XmlPullParserFactoryXmlPullParser來對SD卡裡面的XML格式資料進行解析。採用XmlPullParser的好處是,如果網站下載的xml太大,而我們只需要前面一部份的資料時,就可以隨時停止解析。但是SAXParser則沒有辦法解析到一半就停止。
舉 例來說: 為了避免使用者等待太久,網頁的呈現一開始只有一部份資料,下方也許有一個Button叫「更多資料」。按下Button後,整個畫面會往下呈現全部資 料。像這種情形,就可以利用XmlPullParser在一開始先解析一部份的資料就好,以避免因解析大量XML而導致等待時間太久。


/**
* Start to parse the contents of xml file.
* The order of getEventType() is as follows,
* 1) XmlPullParser.START_DOCUMENT
* 2) XmlPullParser.START_TAG
* 3) XmlPullParser.TEXT
* 4) XmlPullParser.END_TAG
* 5) XmlPullParser.END_DOCUMENT
* The item2,itm3 and item 4 may be a loop
*/
public void startParser() {
   XmlPullParserFactory parserFactory;
   XmlPullParser pullParser;
   try {
       parserFactory = XmlPullParserFactory.newInstance();
       parserFactory.setNamespaceAware(true);
       pullParser = parserFactory.newPullParser();

       FileReader fileReader = new FileReader("sdcard/tmp/xml_file.xml");
       pullParser.setInput(fileReader);

       int eventType = pullParser.getEventType();

       int dataNum = 0 ;
       while (eventType != XmlPullParser.END_DOCUMENT) {

           if (eventType == XmlPullParser.START_TAG){
               Log.d("Test","the tag name is :" + pullParser.getName());
           }else if(eventType == XmlPullParser.TEXT ){
              Log.d("Test","the text value is :" + pullParser.getText());
              dataNum = dataNum + 1;    //讀到一筆資料了
           }
  
           if(dataNum <= 10){
               eventType = pullParser.next(); //往下一個Tag進行分析
           }else{
               break;    //讀到10筆資料後,就離開while迴圈
           }

       }
   } catch (XmlPullParserException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }
}

XmlPullParser詳細用法請參考原文:http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

沒有留言:

張貼留言