在解析XML檔案的過程中,發現API文檔中對於解析事件描述的不夠詳盡,給解析XML檔案帶來了不少的困擾,今天做了個事件類型分析的demo和大家分享一下。
第一步:建立一個Android工程檔案,其他都不用改,只要在onCreate()方法中寫一個xmlTest()方法即可,代碼如下:
[java]
package com.example.xmltest;
import java.io.IOException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xmlTest();
}
/**
* 測試Pull解析方式中的事件類型
*/
private void xmlTest() {
//定義事件類型
int eventType = 0;
try {
XmlResourceParser xrp = getResources().getXml(R.xml.timezones);
// 擷取到xml檔案時,XmlResourceParser的是指向文檔開始處
eventType = xrp.getEventType();
// System.out.println("-------->"+eventType);//查看事件的數值
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
System.out.println("Start document");
break;
case XmlPullParser.START_TAG:
System.out.println("Start tag " + xrp.getName());
break;
case XmlPullParser.TEXT:
System.out.println("Text " + xrp.getText());
break;
case XmlPullParser.END_TAG:
System.out.println("End tag " + xrp.getName());
break;
default:
break;
}
eventType = xrp.next();
//System.out.println("-------->"+eventType);//查看事件的數值
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//判斷事件類型是不是文檔結束
if (eventType == XmlPullParser.END_DOCUMENT) {
System.out.println("End document");
}
}
}
package com.example.xmltest;
import java.io.IOException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xmlTest();
}
/**
* 測試Pull解析方式中的事件類型
*/
private void xmlTest() {
//定義事件類型
int eventType = 0;
try {
XmlResourceParser xrp = getResources().getXml(R.xml.timezones);
// 擷取到xml檔案時,XmlResourceParser的是指向文檔開始處
eventType = xrp.getEventType();
// System.out.println("-------->"+eventType);//查看事件的數值
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
System.out.println("Start document");
break;
case XmlPullParser.START_TAG:
System.out.println("Start tag " + xrp.getName());
break;
case XmlPullParser.TEXT:
System.out.println("Text " + xrp.getText());
break;
case XmlPullParser.END_TAG:
System.out.println("End tag " + xrp.getName());
break;
default:
break;
}
eventType = xrp.next();
//System.out.println("-------->"+eventType);//查看事件的數值
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//判斷事件類型是不是文檔結束
if (eventType == XmlPullParser.END_DOCUMENT) {
System.out.println("End document");
}
}
}
第二步:上面的代碼中用到了一個timezones.xml檔案,代碼如下,只需將下面代碼複製到Android工程檔案-->res-->xml檔案夾下即可:[html] view plaincopyprint?<?xml version="1.0" encoding="utf-8"?>
<timezones>
<timezone id="Pacific/Majuro">馬朱羅</timezone>
<timezone id="Pacific/Midway">中途島</timezone>
</timezones>
<?xml version="1.0" encoding="utf-8"?>
<timezones>
<timezone id="Pacific/Majuro">馬朱羅</timezone>
<timezone id="Pacific/Midway">中途島</timezone>
</timezones>第三部 :在模擬器上運行程式,在LogCat上可以看到如下資訊:
我們對列印結果做分析如下:
1.可以看到Start document列印了兩次,說明當程式執行個體化XmlResourceParser這個對象後,Pull解析器預設的事件是XmlPullParser.START_DOCUMENT,當執行一次XmlResourceParser.next()後,事件仍然指向XmlPullParser.START_DOCUMENT。
2.之後再執行XmlResourceParser.next()則依次向下取一個事件。
3.常用的事件有:XmlPullParser.START_DOCUMENT、XmlPullParser.START_TAG、XmlPullParser.TEXTXmlPullParser.END_TAG、XmlPullParser.END_DOCUMENT。