XPath (XML Path Language) 是在 XML 文件中查找資訊的語言,Java 標準庫 javax.xml.xpath 提供了完整的 XPath 1.0 支援。相較於 DOM/SAX 手動遍歷,XPath 以聲明式路徑表達式精準定位節點,程式碼極為簡潔。
import javax.xml.xpath.*;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XPathDemo {
public static void main(String[] args) throws Exception {
// 1. 載入 XML 文件
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.parse(new File("books.xml"));
// 2. 建立 XPath 對象
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
// 3. 編譯並執行表達式
// 範例:取得所有書名
XPathExpression expr = xpath.compile("//book/title");
NodeList titles = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < titles.getLength(); i++) {
System.out.println(titles.item(i).getTextContent());
}
// 範例:取得屬性值(如 id="bk101" 的價格)
String price = xpath.evaluate("//book[@id='bk101']/price", doc);
System.out.println("價格:" + price);
// 範例:計算節點數量
Number count = (Number) xpath.evaluate("count(//book)", doc, XPathConstants.NUMBER);
System.out.println("書籍總數:" + count.intValue());
}
}
| 表達式 | 說明 |
|---|---|
/bookstore/book | 選取根節點 bookstore 下的所有 book 子節點 |
//book | 選取文件中所有 book 節點(不限層級) |
//book[@category='web'] | 選取 category 屬性為 web 的 book |
//book/title/text() | 取得 title 節點的文本內容 |
//book[price>30] | 選取價格大於 30 的 book |
//book[last()] | 選取最後一個 book |
若 XML 含有命名空間(如 xmlns="https://example.com/ns"),直接查詢會失敗。需實作 NamespaceContext:
xpath.setNamespaceContext(new NamespaceContext() {
public String getNamespaceURI(String prefix) {
return "ns".equals(prefix) ? "https://example.com/ns" : null;
}
public String getPrefix(String uri) { return "ns"; }
public Iterator getPrefixes(String uri) { return null; }
});
// 查詢時使用前綴://ns:book/ns:title
XPathExpression 預編譯,避免重複解析字串。XPathFactory.newInstance().newXPath() 的實作(如 Saxon)支援 XPath 2.0/3.0 及流式處理。XPath 物件非線程安全,每個執行緒應建立自己的實例。XPath 讓 XML 資料提取變得像查詢資料庫一樣直觀。掌握核心 API 與常用語法,即可在 Java 中高效處理各類 XML 文件,從設定檔解析到複雜報表資料擷取皆宜。