主流解析方式對比
| 方式 | 原理 | 內存 | 速度 | 適用場景 |
| DOM | 樹模型,全量加載 | 高 | 慢 | 小文件、需隨機訪問 |
| SAX | 事件驅動,流式 | 低 | 快 | 大文件、單次遍歷 |
| XmlPullParser | 拉取式,流式,可控 | 低 | 快 | Android 推薦標準 |
| 第三方庫 | 封裝上述方式 | 視實現 | 視實現 | 複雜映射、開發效率優先 |
XmlPullParser 核心代碼模板
public List- parseXml(InputStream inputStream) throws Exception {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "UTF-8");
List
- items = new ArrayList<>();
Item currentItem = null;
String currentTag = null;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
currentTag = parser.getName();
if ("item".equals(currentTag)) {
currentItem = new Item();
} else if (currentItem != null) {
// 解析子標簽
if ("title".equals(currentTag)) {
currentItem.title = parser.nextText();
} else if ("link".equals(currentTag)) {
currentItem.link = parser.nextText();
}
}
break;
case XmlPullParser.END_TAG:
if ("item".equals(parser.getName()) && currentItem != null) {
items.add(currentItem);
currentItem = null;
}
break;
}
eventType = parser.next();
}
return items;
}
推薦開源工具庫
- Simple XML:註解驅動,對象映射自動化
- FastXML (Jackson XML):Jackson 生態,性能強,支持流式
- AndroidUtils:作者開源工具類 GitHub 鏈接,封裝了 XmlPullParser 常用操作
性能優化建議
- 複用 `XmlPullParser` 實例(線程不安全,需同步或 ThreadLocal)
- 避免 `nextText()` 頻繁創建字符串,大數據量時手動讀取字符數組
- 解析邏輯與業務模型解耦,使用 Builder 模式構建對象
- 異步線程解析(RxJava/Coroutines),避免阻塞主線程
常見坑點
- 命名空間處理:`parser.getName()` 可能包含前綴,用 `parser.getNamespace()` 判斷
- CDATA 區塊:`nextText()` 自動處理,但需注意特殊字符轉義
- 編碼聲明:確保 `setInput` 指定正確編碼,或檢測 XML 頭聲明