Java SE 6 大幅增強 XML 處理能力:引入 StAX (Pull Parsing)、標準化 JAXB 2.0、重構 Web 服務為 JAX-WS 2.0 (JSR 224),並統一採用 Service Provider 機制 (SPI) 實現廠商中立。本文系統梳理 SAX/DOM/StAX/XSLT 四大解析模型、JAXB 物件綁定、JAX-WS 註解驅動開發全流程,附效能基準與代碼範例。
三層架構:
SAXParserFactory)SAXParserFactoryImpl)運作流程:SAXParserFactory.newInstance() → 讀取 jaxp.properties / META-INF/services/ → 載入廠商實作 → 回傳介面型別實例。


優勢:零代碼切換 XML 處理器、編譯期面向介面、運行期動態綁定、效率與彈性平衡。
| 模型 | API 套件 | 核心特徵 | 記憶體 | 速度 | 上下文感知 | 適用場景 |
|---|---|---|---|---|---|---|
| SAX | javax.xml.parsers | 事件推送 | 極低 | 最快 | 無 (需自行維護) | 大檔、單向流式處理、記憶體受限 |
| DOM | javax.xml.parsers | 樹狀物件模型 | 高 (全載入) | 較慢 | 完整 | 需隨機存取、修改結構、混合內容文檔 |
| StAX | javax.xml.stream | 拉取迭代器 | 低 | 中等 | 有 (迭代器可前瞻) | 大檔且需上下文、雙向導航、效能敏感 |
| XSLT | javax.xml.transform | 聲明式轉換 | 視輸入而定 | 視複雜度 | 支援 | 格式轉換 (XML↔HTML/文本)、報表生成 |
// XML 內容
String xml = ""
+ "Shanghai 200020 "
+ "63262299 1581344454 "
+ "Mr. Wang ";
SAXParserFactory f = SAXParserFactory.newInstance();
SAXParser p = f.newSAXParser();
p.parse(new ByteArrayInputStream(xml.getBytes()), new DefaultHandler() {
public void startElement(String uri, String local, String qName, Attributes attrs) {
System.out.println("SAX Start: " + qName);
}
public void characters(char[] ch, int start, int len) {
String text = new String(ch, start, len).trim();
if (!text.isEmpty()) System.out.println(" Text: " + text);
}
});
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
DocumentBuilder b = f.newDocumentBuilder();
Document doc = b.parse(new ByteArrayInputStream(xml.getBytes()));
// 隨機存取: doc.getElementsByTagName("Location").item(0).getTextContent()
XMLInputFactory f = XMLInputFactory.newInstance();
XMLEventReader r = f.createXMLEventReader(new ByteArrayInputStream(xml.getBytes()));
while (r.hasNext()) {
XMLEvent e = r.nextEvent();
if (e.isStartElement()) System.out.println("StAX Element: " + e.asStartElement().getName());
if (e.isCharacters() && !e.asCharacters().isWhiteSpace())
System.out.println(" Text: " + e.asCharacters().getData());
}



// 測試代碼見原文清單 8
// 結果 (毫秒):
2734 // StAX
4953 // SAX
6516 // DOM
結論:小檔案 SAX 最快,StAX 次之且具上下文優勢,DOM 適合結構操作而非純解析。
xjc workcontactinfo.xsd // 生成 Java 類至 generated/ 目錄
javac generated/*.java
JAXBContext ctx = JAXBContext.newInstance("generated");
ObjectFactory of = new ObjectFactory();
Workcontactinfo info = of.createWorkcontactinfo();
info.setLocation("Shanghai");
info.setPostal("200020");
Tel tel = of.createTel(); tel.setFix("123456"); tel.setMobile("1376666666");
info.setTel(tel); info.setAppellation("Mr. Wang");
Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(info, new FileOutputStream("output.xml"));
輸出標準 XML (見原文清單 13)。
核心 JSR:JSR 224 (JAX-WS)、JSR 222 (JAXB)、JSR 181 (Web Service Metadata)
@WebService
public class Hello {
@WebMethod
public String hello(String name) { return "Hello, " + name + "\n"; }
public static void main(String[] args) {
Endpoint.publish("https://localhost:8080/hello", new Hello());
}
}
apt -d sample Hello.java → 生成輔助類 (jaxws/ 目錄)
java -cp sample hello.Hello → 內建 HTTP Server 發布https://localhost:8080/hello?wsdl
wsimport -p sample -keep https://localhost:8080/hello?wsdl
// 生成樣本目錄結構

HelloService service = new HelloService();
Hello proxy = service.getHelloPort();
System.out.println(proxy.hello("developer works")); // 輸出: Hello, developer works


| 階段 | 工具/API | 關鍵套件 | 產出 |
|---|---|---|---|
| 服務開發 | @WebService/@WebMethod + apt | javax.jws, javax.xml.ws | Endpoint 類 + 輔助類 |
| 發布 | Endpoint.publish() | javax.xml.ws.Endpoint | HTTP 端點 + WSDL |
| 客戶端生成 | wsimport | javax.xml.bind (JAXB) | Service/Proxy/DTO 類 |
| 調用 | Proxy 呼叫 | javax.xml.ws, javax.xml.bind | SOAP 訊息交換 |
| 功能域 | JSR | 核心套件 |
|---|---|---|
| XML 解析 (SAX/DOM) | - | javax.xml.parsers, org.w3c.dom, org.xml.sax |
| StAX | - | javax.xml.stream, javax.xml.stream.events, javax.xml.stream.util |
| XSLT | - | javax.xml.transform, .dom, .sax, .stax, .stream |
| JAXB 2.0 | 222 | javax.xml.bind, .annotation, .annotation.adapters, .attachment, .helpers, .util |
| JAX-WS 2.0 | 224 | javax.xml.ws, .handler, .handler.soap, .http, .soap, .spi |
| Web Service Metadata | 181 | javax.jws, javax.jws.soap |
apt:註解處理 → 生成 JAX-WS 輔助類wsgen:從服務端生成 WSDL/輔助類 (替代 apt)wsimport:從 WSDL 生成客戶端存根schemagen:從 Java 類生成 XML Schemaxjc:從 Schema 生成 Java 類 (JAXB)對 XML 應用開發者:擁有更豐富、高效的工具箱。
對 Web 服務提供者:底層細節被屏蔽,專注業務邏輯。
對企業架構師:標準化技術棧降低廠商鎖定風險,支援異構互操作。
本文基於 Java SE 6 SDK 環境驗證。完整代碼範例可從文末下載。