PULL方式解析XML是在Android中推薦使用的一種解析XML的方式。
事件類型
- START_DOCUMENT:文檔開始,解析器還未讀取到任何輸入的時候
- START_TAG:解析到開始標簽
- TEXT:解析到文本節點
- END_TAG:解析到結束標簽
- END_DOCUMENT:文檔結束
常用方法
// 獲取指定索引屬性的屬性值,索引從0開始
public abstract String getAttributeValue (int index);
public abstract String getAttributeValue(String namespace, String name);
// 返回當前事件類型
public abstract int getEventType ();
// 返回當前事件類型的內容字符串形式
public abstract String getText ();
// 獲取下一個解析事件類型
public abstract int next ();
// 當前是開始標簽,如果下一個元素為文本,則返回該文本字符串,
// 如果下一個元素是結束標簽,則返回空字符串,其它情況將拋出異常
public abstract String nextText ();
// 設置即將被解析的輸入流
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 {
// 創建解析器工廠對象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 從工廠中獲取解析器對象
XmlPullParser parser = factory.newPullParser();
// 設置解析器輸入
parser.setInput(in, encode);
/* 解析 */
// 獲取解析到的事件類型
int eventType = parser.getEventType();
// 未解析到文檔結尾,則循環解析
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT: // 文檔開始事件
// 創建List集合對象
emps = new ArrayList<Employee>();
break;
case XmlPullParser.START_TAG: // 標簽開始事件
String nodeName = parser.getName().trim(); // 節點名稱
if ("employee".equals(nodeName)) { // employee節點
emp = new Employee(); // 創建員工對象
// 該節點有id屬性,則獲取id屬性
int id = Integer.parseInt(parser.getAttributeValue(
null, "id"));
emp.setId(id);
} else if ("name".equals(nodeName)) { // name節點
String name = parser.nextText().trim();
emp.setName(name);
} else if ("age".equals(nodeName)) { // age節點
int age = Integer.parseInt(parser.nextText().trim());
emp.setAge(age);
} else if ("address".equals(nodeName)) { // address節點
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(); // 切換到下一個解析事件
}
} 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>