最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Java中XPath和JsonPath以及SpEL的用法與對(duì)比

 更新時(shí)間:2023年11月20日 08:16:40   作者:G探險(xiǎn)者  
XPath,即XML路徑語(yǔ)言,是一種用于在XML文檔中查找信息的語(yǔ)言,JsonPath是從XPath中發(fā)展而來(lái)的,專門用于JSON數(shù)據(jù)格式,本文主要來(lái)講講他們的用法與區(qū)別,需要的可以參考下

大家好,我是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ì)比分析

特性XPathJsonPathSpELEL
數(shù)據(jù)格式XMLJSON任意任意
查詢語(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é)

XPathJsonPath都是強(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.xpathcom.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編碼的示例代碼

    這篇文章主要介紹了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)到指定位置的示例詳解

    這篇文章主要介紹了Java?for循環(huán)標(biāo)簽跳轉(zhuǎn)到指定位置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • IDEA2020.1常用配置說明

    IDEA2020.1常用配置說明

    這篇文章主要介紹了IDEA2020.1常用配置說明,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Mybatis-Plus實(shí)現(xiàn)只更新部分字段的數(shù)據(jù)

    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)流程

    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)存回收的方法

    這篇文章主要介紹了IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • spring?boot教程之IDEA環(huán)境下的熱加載與熱部署

    spring?boot教程之IDEA環(huán)境下的熱加載與熱部署

    這篇文章主要介紹了spring?boot系列教程中的IDEA環(huán)境下的熱加載與熱部署的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Java中的IO讀寫原理詳解

    Java中的IO讀寫原理詳解

    這篇文章主要介紹了Java中的IO讀寫原理,IO是指輸入和輸出操作的技術(shù),它提供了一組用于讀取和寫入數(shù)據(jù)的類,以及用于處理字符和字節(jié)數(shù)據(jù)的接口,這些類和接口可以用于讀取和寫入文件、網(wǎng)絡(luò)流、內(nèi)存緩沖區(qū)等各種數(shù)據(jù)源和目標(biāo),需要的朋友可以參考下
    2023-08-08
  • vue+ java 實(shí)現(xiàn)多級(jí)菜單遞歸效果

    vue+ java 實(shí)現(xiàn)多級(jí)菜單遞歸效果

    這篇文章主要介紹了vue+ java 實(shí)現(xiàn)多級(jí)菜單遞歸效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java函數(shù)式編程(六):Optional

    Java函數(shù)式編程(六):Optional

    這篇文章主要介紹了Java函數(shù)式編程(六):Optional,本文是系列文章的第6篇,其它文章請(qǐng)參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09

最新評(píng)論

天峨县| 凌源市| 铁岭县| 白沙| 商丘市| 阳曲县| 安阳县| 壤塘县| 梁山县| 清水河县| 巴南区| 抚松县| 吉林市| 惠水县| 灌南县| 诏安县| 龙陵县| 留坝县| 嫩江县| 北宁市| 金门县| 满洲里市| 嘉善县| 金溪县| 新沂市| 鄂温| 永顺县| 滨海县| 察雅县| 班戈县| 封开县| 潢川县| 额济纳旗| 晋中市| 云南省| 睢宁县| 中卫市| 昭平县| 蛟河市| 连云港市| 大城县|