首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 使用 XPath 解析 XML 完整指南

     編輯:Java 相關知識

前言

XPath (XML Path Language) 是在 XML 文件中查找資訊的語言,Java 標準庫 javax.xml.xpath 提供了完整的 XPath 1.0 支援。相較於 DOM/SAX 手動遍歷,XPath 以聲明式路徑表達式精準定位節點,程式碼極為簡潔。

核心 API 快速上手

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());
    }
}

常用 XPath 語法速查表

表達式說明
/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 文件,從設定檔解析到複雜報表資料擷取皆宜。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved