XML 以其良好的可讀性和結構化特性成為數據交換首選,但在早期 MIDP 1.0 時代,受限於設備內存與處理器性能,平台未內置 XML 解析器。隨著硬件升級,JSR 182 雖提供標準 API,但需特定實現。幸運的是,kXML 與 NanoXML 兩大第三方輕量級解析器填補了這一空白,成為 J2ME 開發主流選擇。
XML 解析消耗較多 CPU 與內存資源。若數據結構簡單,優先考慮 DataInputStream/DataOutputStream 二進制流傳輸,效率遠超 XML。僅在需要跨平台互操作、數據結構複雜時才引入 XML。
| 特性 | kXML (增量解析器) | NanoXML (一次性解析器) |
|---|---|---|
| 解析模式 | 流式逐步解析 | 一次性構建完整 DOM 樹 |
| 內存佔用 | 低,適合大文檔 | 高,文檔全載入內存 |
| 適用場景 | 大數據流、流式處理 | 小型配置文檔、需隨機訪問 |
// 從網絡流創建解析器
HttpConnection conn = ...;
InputStreamReader reader = new InputStreamReader(conn.openInputStream());
XmlParser parser = new XmlParser(reader);
// 事件循環解析
boolean keepParsing = true;
while (keepParsing) {
ParseEvent event = parser.read();
switch (event.getType()) {
case Xml.START_TAG:
if ("item".equals(event.getName())) { /* 處理開始標籤 */ }
break;
case Xml.TEXT:
// 獲取標籤文本內容
break;
case Xml.END_DOCUMENT:
keepParsing = false;
break;
}
}
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())) {
String content = node.getContents(); // 獲取節點文本
}
}
隨附 XMLTest MIDlet 演示雙解析器提取 <item> 節點內容,源碼可從文中鏈接下載,包含兩庫完整源碼與在線 API 文檔。
掌握兩種解析器特性,根據數據規模與業務場景靈活選型,是 J2ME 高效處理 XML 的關鍵。