淺析Java中XPath和JsonPath以及SpEL的用法與對(duì)比
大家好,我是G探險(xiǎn)者。
我們編程時(shí),在前后端數(shù)據(jù)交互和傳輸過程中,往往需要對(duì)報(bào)文中的某個(gè)字段或者某個(gè)標(biāo)簽的值進(jìn)行解析讀取,報(bào)文通常是以json或者xml作為數(shù)據(jù)交換格式,而json和xml這兩種格式的報(bào)文結(jié)構(gòu)都是具備一定的層級(jí)關(guān)系的,也就是說我們要想要拿到報(bào)文里面的某個(gè)值,是可以通過一個(gè)路徑定位到的,那么它們具體是怎么通過路徑定位到具體的值呢?
今天咱們就來(lái)聊一聊XPath和JsonPath.
1. XPath
XPath,即XML路徑語(yǔ)言,是一種用于在XML文檔中查找信息的語(yǔ)言。它使用路徑表達(dá)式來(lái)選取XML文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。這些路徑表達(dá)式看起來(lái)很像文件系統(tǒng)中的路徑,旨在快速地定位和操作文檔中的元素。
特點(diǎn)
- 數(shù)據(jù)格式: 專用于XML。
- 查詢結(jié)構(gòu):
/root/child/grandchild的形式,非常結(jié)構(gòu)化。 - 表達(dá)式能力: 支持邏輯運(yùn)算、算術(shù)運(yùn)算和內(nèi)置函數(shù)。
- 使用場(chǎng)景: 主要用于XML文檔的導(dǎo)航和查詢。
示例代碼
假設(shè)有以下XML報(bào)文:
<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處理庫(kù)
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實(shí)例以解析XML文檔
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 創(chuàng)建DocumentBuilder實(shí)例
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML文檔,這里假設(shè)文件名為books.xml
Document doc = builder.parse("books.xml");
// 創(chuàng)建XPath實(shí)例來(lái)查詢XML文檔
XPath xpath = XPathFactory.newInstance().newXPath();
// XPath表達(dá)式,用來(lái)選擇所有的<title>元素
String expression = "/books/book/title";
// 執(zhí)行XPath查詢并獲取結(jié)果節(jié)點(diǎn)列表
NodeList titles = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);
// 遍歷結(jié)果節(jié)點(diǎn)列表并打印每個(gè)<title>元素的文本內(nèi)容
for (int i = 0; i < titles.getLength(); i++) {
System.out.println(titles.item(i).getTextContent());
}
2. JsonPath
JsonPath是從XPath中發(fā)展而來(lái)的,專門用于JSON數(shù)據(jù)格式。它提供了一種簡(jiǎn)單的方法來(lái)使用類似XPath的語(yǔ)法,從JSON對(duì)象中提取所需的信息。
特點(diǎn)
- 數(shù)據(jù)格式: 專用于JSON。
- 查詢結(jié)構(gòu): 使用點(diǎn)記法(例如
$.object.property)或數(shù)組記法(例如$['object']['property'])。 - 表達(dá)式能力: 簡(jiǎn)單,主要用于定位和過濾數(shù)據(jù)。
- 使用場(chǎng)景: 處理RESTful服務(wù)返回的JSON數(shù)據(jù),以及其他JSON數(shù)據(jù)處理。
示例代碼
假設(shè)有如下JSON報(bào)文:
{
"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)題:
首先需要引入這個(gè)依賴:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.8.0</version>
</dependency>// 導(dǎo)入JsonPath庫(kù)
import com.jayway.jsonpath.JsonPath;
import net.minidev.json.JSONArray;
// ...
// JSON字符串,表示一個(gè)書店的存貨,包括書籍和自行車
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á)式,用來(lái)選取所有書籍的標(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);
}除了上面這個(gè)com.jayway.jsonpath 依賴包的方法,還有另外一個(gè)依賴包可以處理,官網(wǎng)學(xué)習(xí)地址:github.com/noear/snack3
<dependency>
<groupId>org.noear</groupId>
<artifactId>snack3</artifactId>
</<dependency>
3. 拓展
除了以上的XPath和JsonPath,其實(shí)還有類似的路徑表達(dá)式是來(lái)從對(duì)象中獲取某個(gè)值 SpEL(Spring Expression Language)和EL(Expression Language)通常用于在Java企業(yè)應(yīng)用中進(jìn)行動(dòng)態(tài)查詢和管理應(yīng)用程序的行為。 SpEL是Spring框架提供的一種功能強(qiáng)大的表達(dá)式語(yǔ)言,而EL最初是為了簡(jiǎn)化JSP頁(yè)面的數(shù)據(jù)展示而生,后來(lái)也被整合到了JSF和其他Java企業(yè)技術(shù)中。
3.1 SpEL
- 數(shù)據(jù)格式: 不依賴特定數(shù)據(jù)格式,可以用于對(duì)象圖導(dǎo)航。
- 查詢結(jié)構(gòu): 使用類似于JsonPath的點(diǎn)記法,如
@beanName.method()。 - 表達(dá)式能力: 非常強(qiáng)大,支持方法調(diào)用、關(guān)系運(yùn)算、正則表達(dá)式匹配等。
- 使用場(chǎng)景: 在Spring框架中進(jìn)行配置、驗(yàn)證、模板操作等,非常靈活。
示例代碼:
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.Expression;
// 創(chuàng)建一個(gè)表達(dá)式解析器
ExpressionParser parser = new SpelExpressionParser();
// 解析一個(gè)字符串表達(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對(duì)象。
- 查詢結(jié)構(gòu): 使用
${object.property}的形式,主要用于Web層。 - 表達(dá)式能力: 相對(duì)簡(jiǎn)單,支持簡(jiǎn)單的屬性訪問和算術(shù)操作。
- 使用場(chǎng)景: 主要用于JSP和JSF等Java EE技術(shù)中,用于簡(jiǎn)化頁(yè)面層的數(shù)據(jù)展示。
import javax.el.ELProcessor;
// 創(chuàng)建ELProcessor實(shí)例
ELProcessor elProcessor = new ELProcessor();
// 定義一個(gè)變量并賦值
elProcessor.setValue("greeting", "Hello");
// 使用EL表達(dá)式拼接字符串
String result = (String) elProcessor.eval("greeting.concat(' World!')");
// 輸出結(jié)果,將打印:Hello World!
System.out.println(result);4. 對(duì)比分析
| 特性 | XPath | JsonPath | SpEL | EL |
|---|---|---|---|---|
| 數(shù)據(jù)格式 | XML | JSON | 任意 | 任意 |
| 查詢語(yǔ)法 | 結(jié)構(gòu)化路徑 | 點(diǎn)記法/數(shù)組記法 | 點(diǎn)記法/方法調(diào)用 | 簡(jiǎn)化屬性訪問 |
| 表達(dá)式能力 | 邏輯/算術(shù)運(yùn)算 | 定位/過濾 | 方法調(diào)用/正則表達(dá)式 | 簡(jiǎn)單屬性/算術(shù) |
| 使用場(chǎng)景 | XML文檔查詢 | JSON數(shù)據(jù)處理 | Spring應(yīng)用 | JSP/JSF頁(yè)面 |
5. 總結(jié)
XPath和JsonPath都是強(qiáng)大的查詢語(yǔ)言,它們使得從復(fù)雜的數(shù)據(jù)結(jié)構(gòu)中提取信息變得更加容易。XPath適用于XML數(shù)據(jù),而JsonPath適用于JSON數(shù)據(jù)。兩者各有優(yōu)勢(shì),具體使用哪一個(gè)取決于你的數(shù)據(jù)格式和需求。在Java中,有多個(gè)庫(kù)可以用來(lái)執(zhí)行XPath和JsonPath查詢,如javax.xml.xpath和com.jayway.jsonpath等。
在選擇使用哪種表達(dá)式語(yǔ)言時(shí),通常取決于你的應(yīng)用場(chǎng)景和所操作的數(shù)據(jù)類型。如果你在處理XML或JSON數(shù)據(jù),XPath和JsonPath是專門為這些格式設(shè)計(jì)的。而如果你在Spring框架中工作,SpEL將提供更豐富的功能和更大的靈活性。對(duì)于簡(jiǎn)單的Web頁(yè)面數(shù)據(jù)展示,EL是一個(gè)輕量級(jí)且易于使用的選擇。
到此這篇關(guān)于淺析Java中XPath和JsonPath以及SpEL的用法與對(duì)比的文章就介紹到這了,更多相關(guān)Java XPath JsonPath內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Data Jpa Mysql使用utf8mb4編碼的示例代碼
這篇文章主要介紹了Spring Data Jpa Mysql使用utf8mb4編碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-11-11
Java?for循環(huán)標(biāo)簽跳轉(zhuǎn)到指定位置的示例詳解
這篇文章主要介紹了Java?for循環(huán)標(biāo)簽跳轉(zhuǎn)到指定位置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Mybatis-Plus實(shí)現(xiàn)只更新部分字段的數(shù)據(jù)
這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)只更新部分字段的數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之網(wǎng)上商城系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java+jsp+servlet+mysql+ajax實(shí)現(xiàn)一個(gè)網(wǎng)上商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11
IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法
這篇文章主要介紹了IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
spring?boot教程之IDEA環(huán)境下的熱加載與熱部署
這篇文章主要介紹了spring?boot系列教程中的IDEA環(huán)境下的熱加載與熱部署的相關(guān)資料,需要的朋友可以參考下2022-09-09
vue+ java 實(shí)現(xiàn)多級(jí)菜單遞歸效果
這篇文章主要介紹了vue+ java 實(shí)現(xiàn)多級(jí)菜單遞歸效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12

