MIDP 1.0 無內建 XML 支援;MIDP 2.0 (JSR 180) 僅提供可選 API。第三方庫成為唯一選擇。主流兩派:
// 從網路串流解析
HttpConnection conn = (HttpConnection) Connector.open(url);
InputStreamReader reader = new InputStreamReader(conn.openInputStream());
XmlParser parser = new XmlParser(reader);
boolean parsing = true;
while (parsing) {
ParseEvent event = parser.read();
switch (event.getType()) {
case Xml.START_TAG:
if ("item".equals(event.getName())) inItem = true;
break;
case Xml.TEXT:
if (inItem) items.addElement(event.getText());
break;
case Xml.END_TAG:
if ("item".equals(event.getName())) inItem = false;
break;
case Xml.END_DOCUMENT:
parsing = false;
break;
}
}
reader.close();
優勢:無需載入完整文檔,ParseEvent 逐個產生,峰值記憶體 ≈ 當前元素大小。
kXMLElement root = new kXMLElement();
root.parseFromReader(reader); // 一次性解析完畢
Vector children = root.getChildren();
for (int i = 0; i < children.size(); i++) {
kXMLElement node = (kXMLElement) children.elementAt(i);
if ("item".equals(node.getTagName())) {
items.addElement(node.getContents());
}
}
優勢:代碼簡潔,支援 XPath 風格查詢,適合小型配置文件(< 10 KB)。
| 指標 | kXML (Pull) | NanoXML (DOM) |
|---|---|---|
| 峰值堆記憶體 | ~8 KB | ~45 KB |
| 解析耗時 | 120 ms | 95 ms |
| JAR 體積增加 | ~25 KB | ~18 KB |
| 適合場景 | 大文檔、串流、低記憶體裝置 | 小配置、需隨機存取、開發效率優先 |
大型回應(如地圖資料、排行榜)用 kXML 串流解析並直接寫入 RMS;小型配置(如遊戲參數、UI 文字)用 NanoXML 一次性載入緩存。
Content-Type: charset=utf-8,需手動指定 new InputStreamReader(is, "UTF-8")。getNamespace(),解析 SOAP/WS 需額外處理。try-catch 包裹 parser.read(),避免 MIDlet 崩潰。選型原則:**預設用 kXML**,除非文檔極小且需反覆隨機查詢。記住:J2ME 上「能不用 DOM 就不用 DOM」,每 1 KB 堆記憶體都可能決定能否在 200 KB 裝置上存活。