淺析Java中XPath和JsonPath以及SpEL的用法與對比
大家好,我是G探險者。
我們編程時,在前后端數(shù)據(jù)交互和傳輸過程中,往往需要對報文中的某個字段或者某個標(biāo)簽的值進(jìn)行解析讀取,報文通常是以json或者xml作為數(shù)據(jù)交換格式,而json和xml這兩種格式的報文結(jié)構(gòu)都是具備一定的層級關(guān)系的,也就是說我們要想要拿到報文里面的某個值,是可以通過一個路徑定位到的,那么它們具體是怎么通過路徑定位到具體的值呢?
今天咱們就來聊一聊XPath和JsonPath.
1. XPath
XPath,即XML路徑語言,是一種用于在XML文檔中查找信息的語言。它使用路徑表達(dá)式來選取XML文檔中的節(jié)點或節(jié)點集。這些路徑表達(dá)式看起來很像文件系統(tǒng)中的路徑,旨在快速地定位和操作文檔中的元素。
特點
- 數(shù)據(jù)格式: 專用于XML。
- 查詢結(jié)構(gòu):
/root/child/grandchild
的形式,非常結(jié)構(gòu)化。 - 表達(dá)式能力: 支持邏輯運算、算術(shù)運算和內(nèi)置函數(shù)。
- 使用場景: 主要用于XML文檔的導(dǎo)航和查詢。
示例代碼
假設(shè)有以下XML報文:
<books> <book> <title>Java Programming</title> <author>James Gosling</author> </book> <book> <title>XML Fundamentals</title> <author>John Doe</author> </book> </books>
使用XPath找到所有書籍的標(biāo)題:
// 導(dǎo)入所需的XML處理庫 import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import javax.xml.xpath.XPathConstants; import org.w3c.dom.NodeList; // ... // 創(chuàng)建DocumentBuilderFactory實例以解析XML文檔 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 創(chuàng)建DocumentBuilder實例 DocumentBuilder builder = factory.newDocumentBuilder(); // 解析XML文檔,這里假設(shè)文件名為books.xml Document doc = builder.parse("books.xml"); // 創(chuàng)建XPath實例來查詢XML文檔 XPath xpath = XPathFactory.newInstance().newXPath(); // XPath表達(dá)式,用來選擇所有的<title>元素 String expression = "/books/book/title"; // 執(zhí)行XPath查詢并獲取結(jié)果節(jié)點列表 NodeList titles = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET); // 遍歷結(jié)果節(jié)點列表并打印每個<title>元素的文本內(nèi)容 for (int i = 0; i < titles.getLength(); i++) { System.out.println(titles.item(i).getTextContent()); }
2. JsonPath
JsonPath是從XPath中發(fā)展而來的,專門用于JSON數(shù)據(jù)格式。它提供了一種簡單的方法來使用類似XPath的語法,從JSON對象中提取所需的信息。
特點
- 數(shù)據(jù)格式: 專用于JSON。
- 查詢結(jié)構(gòu): 使用點記法(例如
$.object.property
)或數(shù)組記法(例如$['object']['property']
)。 - 表達(dá)式能力: 簡單,主要用于定位和過濾數(shù)據(jù)。
- 使用場景: 處理RESTful服務(wù)返回的JSON數(shù)據(jù),以及其他JSON數(shù)據(jù)處理。
示例代碼
假設(shè)有如下JSON報文:
{ "store": { "book": [ { "title": "Clean Code", "author": "Robert C. Martin" }, { "title": "The Pragmatic Programmer", "author": "Andrew Hunt and David Thomas" } ], "bicycle": { "color": "red", "price": 19.95 } } }
使用JsonPath獲取所有書籍的標(biāo)題:
首先需要引入這個依賴:
<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.8.0</version> </dependency>
// 導(dǎo)入JsonPath庫 import com.jayway.jsonpath.JsonPath; import net.minidev.json.JSONArray; // ... // JSON字符串,表示一個書店的存貨,包括書籍和自行車 String json = "{ \"store\": { \"book\": [ { \"title\": \"Clean Code\", \"author\": \"Robert C. Martin\" }, { \"title\": \"The Pragmatic Programmer\", \"author\": \"Andrew Hunt and David Thomas\" } ], \"bicycle\": { \"color\": \"red\", \"price\": 19.95 } } }"; // JsonPath表達(dá)式,用來選取所有書籍的標(biāo)題 String jsonPathExpression = "$.store.book[*].title"; // 執(zhí)行JsonPath查詢并獲取結(jié)果為JSONArray JSONArray bookTitles = JsonPath.read(json, jsonPathExpression); // 遍歷JSONArray并打印每本書的標(biāo)題 for (Object title : bookTitles) { System.out.println(title); }
除了上面這個com.jayway.jsonpath 依賴包的方法,還有另外一個依賴包可以處理,官網(wǎng)學(xué)習(xí)地址:github.com/noear/snack3
<dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId> </<dependency>
3. 拓展
除了以上的XPath和JsonPath,其實還有類似的路徑表達(dá)式是來從對象中獲取某個值 SpEL(Spring Expression Language)和EL(Expression Language)通常用于在Java企業(yè)應(yīng)用中進(jìn)行動態(tài)查詢和管理應(yīng)用程序的行為。 SpEL是Spring框架提供的一種功能強大的表達(dá)式語言,而EL最初是為了簡化JSP頁面的數(shù)據(jù)展示而生,后來也被整合到了JSF和其他Java企業(yè)技術(shù)中。
3.1 SpEL
- 數(shù)據(jù)格式: 不依賴特定數(shù)據(jù)格式,可以用于對象圖導(dǎo)航。
- 查詢結(jié)構(gòu): 使用類似于JsonPath的點記法,如
@beanName.method()
。 - 表達(dá)式能力: 非常強大,支持方法調(diào)用、關(guān)系運算、正則表達(dá)式匹配等。
- 使用場景: 在Spring框架中進(jìn)行配置、驗證、模板操作等,非常靈活。
示例代碼:
import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.Expression; // 創(chuàng)建一個表達(dá)式解析器 ExpressionParser parser = new SpelExpressionParser(); // 解析一個字符串表達(dá)式,并執(zhí)行字符串拼接 Expression exp = parser.parseExpression("'Hello World'.concat('!')"); String message = (String) exp.getValue(); // 輸出結(jié)果,將打?。篐ello World! System.out.println(message);
3.2 EL
- 數(shù)據(jù)格式: 不依賴特定數(shù)據(jù)格式,通常用于訪問JavaBeans對象。
- 查詢結(jié)構(gòu): 使用
${object.property}
的形式,主要用于Web層。 - 表達(dá)式能力: 相對簡單,支持簡單的屬性訪問和算術(shù)操作。
- 使用場景: 主要用于JSP和JSF等Java EE技術(shù)中,用于簡化頁面層的數(shù)據(jù)展示。
import javax.el.ELProcessor; // 創(chuàng)建ELProcessor實例 ELProcessor elProcessor = new ELProcessor(); // 定義一個變量并賦值 elProcessor.setValue("greeting", "Hello"); // 使用EL表達(dá)式拼接字符串 String result = (String) elProcessor.eval("greeting.concat(' World!')"); // 輸出結(jié)果,將打印:Hello World! System.out.println(result);
4. 對比分析
特性 | XPath | JsonPath | SpEL | EL |
---|---|---|---|---|
數(shù)據(jù)格式 | XML | JSON | 任意 | 任意 |
查詢語法 | 結(jié)構(gòu)化路徑 | 點記法/數(shù)組記法 | 點記法/方法調(diào)用 | 簡化屬性訪問 |
表達(dá)式能力 | 邏輯/算術(shù)運算 | 定位/過濾 | 方法調(diào)用/正則表達(dá)式 | 簡單屬性/算術(shù) |
使用場景 | XML文檔查詢 | JSON數(shù)據(jù)處理 | Spring應(yīng)用 | JSP/JSF頁面 |
5. 總結(jié)
XPath和JsonPath都是強大的查詢語言,它們使得從復(fù)雜的數(shù)據(jù)結(jié)構(gòu)中提取信息變得更加容易。XPath適用于XML數(shù)據(jù),而JsonPath適用于JSON數(shù)據(jù)。兩者各有優(yōu)勢,具體使用哪一個取決于你的數(shù)據(jù)格式和需求。在Java中,有多個庫可以用來執(zhí)行XPath和JsonPath查詢,如javax.xml.xpath
和com.jayway.jsonpath
等。
在選擇使用哪種表達(dá)式語言時,通常取決于你的應(yīng)用場景和所操作的數(shù)據(jù)類型。如果你在處理XML或JSON數(shù)據(jù),XPath和JsonPath是專門為這些格式設(shè)計的。而如果你在Spring框架中工作,SpEL將提供更豐富的功能和更大的靈活性。對于簡單的Web頁面數(shù)據(jù)展示,EL是一個輕量級且易于使用的選擇。
到此這篇關(guān)于淺析Java中XPath和JsonPath以及SpEL的用法與對比的文章就介紹到這了,更多相關(guān)Java XPath JsonPath內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)簡易學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07SpringBoot自定義加載yml實現(xiàn)方式,附源碼解讀
這篇文章主要介紹了SpringBoot自定義加載yml實現(xiàn)方式附源碼解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03超詳細(xì)講解SpringBoot參數(shù)校驗實例
經(jīng)常需要提供接口與用戶交互(獲取數(shù)據(jù)、上傳數(shù)據(jù)等),由于這個過程需要用戶進(jìn)行相關(guān)的操作,為了避免出現(xiàn)一些錯誤的數(shù)據(jù)等,一般需要對數(shù)據(jù)進(jìn)行校驗,下面這篇文章主要給大家介紹了關(guān)于SpringBoot各種參數(shù)校驗的相關(guān)資料,需要的朋友可以參考下2022-05-05關(guān)于Java錯誤提示之找不到或無法加載主類的問題及正確處理方法
當(dāng)我們在初學(xué)Java的是時候,類文件中是不設(shè)定包名(package)的,這種情況下注意classpath,基本上沒有問題,?本文主要說明classpath和系統(tǒng)環(huán)境變量PATH都沒問題的情況下出錯原因和正確處理方法,感興趣的朋友一起看看吧2022-01-01jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例
這篇文章主要介紹了jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例,需要的朋友可以參考下2014-05-05