PULL方式解析XML是在Android中推薦使用的一種解析XML的方式针余。
事件類(lèi)型
- START_DOCUMENT:文檔開(kāi)始屋摇,解析器還未讀取到任何輸入的時(shí)候
- START_TAG:解析到開(kāi)始標(biāo)簽
- TEXT:解析到文本節(jié)點(diǎn)
- END_TAG:解析到結(jié)束標(biāo)簽
- END_DOCUMENT:文檔結(jié)束
常用方法
// 獲取指定索引屬性的屬性值,索引從0開(kāi)始
public abstract String getAttributeValue (int index);
public abstract String getAttributeValue(String namespace, String name);
// 返回當(dāng)前事件類(lèi)型
public abstract int getEventType ();
// 返回當(dāng)前事件類(lèi)型的內(nèi)容字符串形式
public abstract String getText ();
// 獲取下一個(gè)解析事件類(lèi)型
public abstract int next ();
// 當(dāng)前是開(kāi)始標(biāo)簽殴瘦,如果下一個(gè)元素為文本挡育,則返回該文本字符串,
// 如果下一個(gè)元素是結(jié)束標(biāo)簽,則返回空字符串扣癣,其它情況將拋出異常
public abstract String nextText ();
// 設(shè)置即將被解析的輸入流
public abstract void setInput (InputStream inputStream, String inputEncoding);
Android示例
private void parseLayout(int layout) {
Resources resources = getResources();
XmlPullParser parser = resources.getLayout(layout);
try {
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_DOCUMENT:
Log.i("steven", "START_DOCUMENT - " + parser.getName());
break;
case XmlPullParser.START_TAG:
Log.i("steven", "START_TAG -- " + parser.getName());
int attrCount = parser.getAttributeCount();
String separator = " , ";
for (int i = 0; i < attrCount; i++) {
StringBuffer sb = new StringBuffer();
sb.append("name = ");
sb.append(parser.getAttributeName(i));
sb.append(separator);
sb.append("value = ");
sb.append(parser.getAttributeValue(i));
sb.append(separator);
sb.append("type = ");
sb.append(parser.getAttributeType(i));
Log.i("steven", sb.toString());
}
break;
case XmlPullParser.END_TAG:
Log.i("steven", "END_TAG --" + parser.getName());
break;
}
type = parser.next();
}
Log.i("steven", "END_DOCUMENT - " + parser.getName());
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
XML布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/item_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/item_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp" />
</LinearLayout>
輸出日志
I/steven (30085): START_DOCUMENT - null
I/steven (30085): START_DOCUMENT - null
I/steven (30085): START_TAG -- LinearLayout
I/steven (30085): name = orientation , value = 0 , type = CDATA
I/steven (30085): name = layout_width , value = -2 , type = CDATA
I/steven (30085): name = layout_height , value = -2 , type = CDATA
I/steven (30085): START_TAG -- ImageView
I/steven (30085): name = id , value = @2131427425 , type = CDATA
I/steven (30085): name = layout_width , value = -2 , type = CDATA
I/steven (30085): name = layout_height , value = -2 , type = CDATA
I/steven (30085): END_TAG --ImageView
I/steven (30085): START_TAG -- TextView
I/steven (30085): name = id , value = @2131427426 , type = CDATA
I/steven (30085): name = layout_width , value = -2 , type = CDATA
I/steven (30085): name = layout_height , value = -2 , type = CDATA
I/steven (30085): name = layout_marginLeft , value = 10.0dip , type = CDATA
I/steven (30085): END_TAG --TextView
I/steven (30085): END_TAG --LinearLayout
I/steven (30085): END_DOCUMENT - null
示例
public static List<Employee> readXml(InputStream in, String encode) {
List<Employee> emps = null;
Employee emp = null;
try {
// 創(chuàng)建解析器工廠對(duì)象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 從工廠中獲取解析器對(duì)象
XmlPullParser parser = factory.newPullParser();
// 設(shè)置解析器輸入
parser.setInput(in, encode);
/* 解析 */
// 獲取解析到的事件類(lèi)型
int eventType = parser.getEventType();
// 未解析到文檔結(jié)尾惰帽,則循環(huán)解析
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT: // 文檔開(kāi)始事件
// 創(chuàng)建List集合對(duì)象
emps = new ArrayList<Employee>();
break;
case XmlPullParser.START_TAG: // 標(biāo)簽開(kāi)始事件
String nodeName = parser.getName().trim(); // 節(jié)點(diǎn)名稱(chēng)
if ("employee".equals(nodeName)) { // employee節(jié)點(diǎn)
emp = new Employee(); // 創(chuàng)建員工對(duì)象
// 該節(jié)點(diǎn)有id屬性,則獲取id屬性
int id = Integer.parseInt(parser.getAttributeValue(
null, "id"));
emp.setId(id);
} else if ("name".equals(nodeName)) { // name節(jié)點(diǎn)
String name = parser.nextText().trim();
emp.setName(name);
} else if ("age".equals(nodeName)) { // age節(jié)點(diǎn)
int age = Integer.parseInt(parser.nextText().trim());
emp.setAge(age);
} else if ("address".equals(nodeName)) { // address節(jié)點(diǎn)
String address = parser.nextText();
emp.setAddress(address);
}
break;
case XmlPullParser.END_TAG:
if ("employee".equals(parser.getName().trim())) {
emps.add(emp);
emp = null;
}
break;
}
eventType = parser.next(); // 切換到下一個(gè)解析事件
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return emps;
}
<employees>
<employee id="1">
<name>小明</name>
<age>29</age>
<address>四川成都</address>
</employee>
<employee id="2">
<name>老駱</name>
<age>35</age>
<address>四川成都</address>
</employee>
</employees>