Pull 解析器(XmlPullParser)是 Android 官方推薦、輕量高效的 XML 解析方式。不同於 DOM 一次性載入整棵樹,Pull 解析器以流式方式逐節點讀取,內存佔用極低,極適合移動端及大文件場景。本文通過完整示例講解核心 API 與最佳實踐。
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1001">
<stuno>1001</stuno>
<name>張三</name>
<sex>男</sex>
<grade>Java一班</grade>
</student>
<student id="1002">
<stuno>1002</stuno>
<name>李四</name>
<sex>女</sex>
<grade>Java二班</grade>
</student>
<student id="1003">
<stuno>1003</stuno>
<name>小二</name>
<sex>男</sex>
<grade>Java三班</grade>
</student>
<student id="1004">
<stuno>1004</stuno>
<name>小蠟</name>
<sex>女</sex>
<grade>Java四班</grade>
</student>
</students>
package xmlpulldemo;
import java.io.FileInputStream;
import java.io.IOException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class XmlPullDemo {
public static void main(String[] args) throws XmlPullParserException, IOException {
// 1. 獲取解析工廠
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 2. 創建解析器
XmlPullParser parser = factory.newPullParser();
// 3. 設置輸入流與編碼
parser.setInput(new FileInputStream("src/xmlwendang/student.xml"), "UTF-8");
// 4. 事件驅動循環
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
System.out.println("=== 開始解析文檔 ===");
break;
case XmlPullParser.START_TAG:
String tagName = parser.getName();
if ("student".equals(tagName)) {
// 獲取屬性值
String id = parser.getAttributeValue(null, "id");
System.out.println("\n學生 ID: " + id);
} else if ("stuno".equals(tagName)) {
System.out.println("學號: " + parser.nextText());
} else if ("name".equals(tagName)) {
System.out.println("姓名: " + parser.nextText());
} else if ("sex".equals(tagName)) {
System.out.println("性別: " + parser.nextText());
} else if ("grade".equals(tagName)) {
System.out.println("班級: " + parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if ("student".equals(parser.getName())) {
System.out.println("--- 學生信息結束 ---");
}
break;
}
// 移動到下一個事件
eventType = parser.next();
}
System.out.println("\n=== 文檔解析完成 ===");
}
}
START_DOCUMENT、START_TAG、TEXT、END_TAG、END_DOCUMENT。START_TAG 事件中調用 parser.nextText() 可直接讀取該標籤內的文本,並自動移動到對應的 END_TAG。getAttributeValue(namespace, name),namespace 通常傳 null。parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true) 並使用帶命名空間的方法。=== 開始解析文檔 ===
學生 ID: 1001
學號: 1001
姓名: 張三
性別: 男
班級: Java一班
--- 學生信息結束 ---
學生 ID: 1002
學號: 1002
姓名: 李四
性別: 女
班級: Java二班
--- 學生信息結束 ---
...
=== 文檔解析完成 ===
org.xmlpull.v1 已內置。掌握 Pull 解析,是 Java/Android 處理 XML 數據的必備技能。