XML(Extensible Markup Language)作為獨立於硬體與軟體的標記語言,廣泛應用於資料交換與儲存。在 J2ME 行動裝置開發中,若需讀取 XML 檔案,必須引入適合行動裝置的輕量級 XML 解析器。本文將介紹主流的 J2ME XML 解析器、兩種解析模式的差異,並以 TinyXML 為例,完整示範如何在 MIDlet 中讀取並解析遠端 XML 資料。
受限於行動裝置記憶體與運算資源,J2ME 專用的 XML 解析器特點是佔用記憶體極小。常見的開源解析器包括:
這些解析器皆為 JAR 封裝的 Java 類別庫,需從網路下載後加入專案的 lib 目錄。
逐一解析 XML 元素,透過回呼方法將解析結果傳遞給 MIDlet。優點是記憶體佔用極低,適合大型 XML;缺點是無法隨機存取節點,程式邏輯較複雜。
一次性將整份 XML 讀入記憶體並建立樹狀結構。優點是導航與操作資料極為方便、速度快;缺點是記憶體開銷大,不適合超大型 XML 檔案。
TinyXML.jar(約 15KB)並放置於 X:\WTK104\apps\ProjectName\lib。mail.xml,部署於 J2EE 伺服器的 public_html 目錄:<?xml version="1.0" ?>
<mail>
<From>Developer</From>
<To>Students</To>
<Cc>Faculty</Cc>
<Date>30</Date>
<Subject>Integration</Subject>
<Body Language="English">
This is J2ME!!!!!!
</Body>
</mail>
import java.io.*;
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import gd.xml.*;
import gd.xml.tiny.*;
public class tinyTreeDemo extends MIDlet implements CommandListener {
private String url = "https://127.0.0.1:8000/mail.xml";
private ParsedXML root;
private Display myDisplay;
private Form mainScreen;
private TextField requestField;
private Command sendCommand = new Command("SEND", Command.OK, 1);
public tinyTreeDemo() {
myDisplay = Display.getDisplay(this);
mainScreen = new Form("Type a URL:");
requestField = new TextField(null, url, 100, TextField.URL);
mainScreen.append(requestField);
mainScreen.addCommand(sendCommand);
mainScreen.setCommandListener(this);
}
public void startApp() throws MIDletStateChangeException {
myDisplay.setCurrent(mainScreen);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
if (c == sendCommand) {
try {
root = TinyParser.parseXML(url);
displayNode(root);
} catch (ParseException e) {
System.err.println("parseXML: " + e);
}
}
}
private void displayNode(ParsedXML px) {
String nodeName = px.getTypeName();
if (px.getName() != null) nodeName += "<" + px.getName() + ">";
String nodeContent = px.getContent() != null ? px.getContent() : "";
System.out.println(nodeName + ":");
System.out.println(nodeContent);
Enumeration attrs = px.attributes();
if (attrs.hasMoreElements()) {
System.out.print("attribute:");
while (attrs.hasMoreElements()) {
String attrName = (String) attrs.nextElement();
System.out.println(attrName + ": " + px.getAttribute(attrName));
}
}
Enumeration elems = px.elements();
if (elems.hasMoreElements()) {
while (elems.hasMoreElements()) {
displayNode((ParsedXML) elems.nextElement());
}
}
}
}
啟動 J2EE 伺服器後執行專案,主控台將輸出解析結果:
root:
tag<mail>:
tag<From>:
text:
Developer
tag<To>:
text:
Students
tag<Cc>:
text:
Faculty
tag<Date>:
text:
30
tag<Subject>:
text:
Integration
tag<Body>:
attribute:Language:English
text:
This is J2ME!!!!!!
透過 TinyXML 這類輕量解析器,J2ME 應用程式能高效整合 XML 資料,滿足行動裝置與伺服器端的資料交換需求。開發者可根據專案資料量與複雜度,選擇事件驅動或樹狀模式,平衡記憶體使用與開發便利性。