Apache Commons JXPath 將 XPath 的強大查詢能力帶入 Java 對象圖,讓開發者能像查詢 XML 一樣遍歷、修改、統計 Java Bean、集合、Map 甚至混合對象結構。本文彙總核心用法與最佳實踐,助你快速上手。
所有操作從 JXPathContext.newContext(rootBean) 開始。上下文決定了 XPath 表達式的求值根節點,類似 XML 中的文檔根。
String firstName = (String) context.getValue("firstName");
context.setValue("lastName", "Wang");
路徑表達式遵循標準 XPath 語法,屬性訪問對應 JavaBean 的 getter/setter。
針對 List/Collection,JXPath 支援豐富的謂詞與核心函數庫:
// 計數:name='oo' 且 id='1' 的元素個數
Number count = (Number) context.getValue("count(.[name='oo' and id='1'])");
// 求和:符合條件元素的 id 總和
Number sum = (Number) context.getValue("sum(.[name='oo' and id='1']/id)");
// 迭代前三本書
Iterator<Book> firstThree = context.iterate("books[position() < 4]");
對於 Map<String, Address> addresses,可用 addresses[@name='home']/zipCode 直接定位到 key 為 "home" 的 Entry 並取其屬性。
將 XML 文檔包裝為 XMLDocumentContainer 掛載到 Bean 屬性上,即可在同一 XPath 中混合訪問 Java 對象與 XML 節點:
String street = (String) context.getValue(
"locations/vendor/location[@id='store102']//street");
實現 AbstractFactory 並在上下文註冊,即可在路徑不存在時自動實例化對象:
context.setFactory(new AddressFactory());
context.createPathAndSetValue("address/zipCode", "90190");
context.getVariables().declareVariable("index", 3); → 路徑中用 $index 引用。context.setFunctions(new ClassFunctions(Formats.class, "format")); → format:date($today, 'MM/dd/yyyy')。context.getRelativeContext(pointer) 可將求值焦點移動到任意子節點,簡化深層結構操作。
JXPath 以 XPath 為統一查詢語言,打通了 Java Bean、集合、Map、XML 等異構數據模型,極大簡化了對象圖的遍歷與操作代碼。掌握其核心 API 與 XPath 標準函數,即可在實際項目中大幅減少樣板代碼。