某些需要從網站下載xml資料,進行解析的程式。個人建議將解析的流程寫在一個Service裡面,如此一來才不會影響使用者當下操作的畫面。當解析完畢時,再將所需的資料丟給所需要的Activity或是DB或是進行處理。下面程式利用XmlPullParserFactory和XmlPullParser來對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
舉 例來說: 為了避免使用者等待太久,網頁的呈現一開始只有一部份資料,下方也許有一個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
沒有留言:
張貼留言