欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年11月20日 08:16:40   作者:G探險(xiǎn)者  
XPath,即XML路徑語言,是一種用于在XML文檔中查找信息的語言,JsonPath是從XPath中發(fā)展而來的,專門用于JSON數(shù)據(jù)格式,本文主要來講講他們的用法與區(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è)路徑定位到的,那么它們具體是怎么通過路徑定位到具體的值呢?

今天咱們就來聊一聊XPath和JsonPath.

1. XPath

XPath,即XML路徑語言,是一種用于在XML文檔中查找信息的語言。它使用路徑表達(dá)式來選取XML文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。這些路徑表達(dá)式看起來很像文件系統(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í)例來查詢XML文檔
XPath xpath = XPathFactory.newInstance().newXPath();
// XPath表達(dá)式,用來選擇所有的<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ā)展而來的,專門用于JSON數(shù)據(jù)格式。它提供了一種簡(jiǎn)單的方法來使用類似XPath的語法,從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á)式,用來選取所有書籍的標(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á)式是來從對(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á)式語言,而EL最初是為了簡(jiǎn)化JSP頁面的數(shù)據(jù)展示而生,后來也被整合到了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)化頁面層的數(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é)果,將打?。篐ello World!
System.out.println(result);

4. 對(duì)比分析

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

5. 總結(jié)

XPathJsonPath都是強(qiáng)大的查詢語言,它們使得從復(fù)雜的數(shù)據(jù)結(jié)構(gòu)中提取信息變得更加容易。XPath適用于XML數(shù)據(jù),而JsonPath適用于JSON數(shù)據(jù)。兩者各有優(yōu)勢(shì),具體使用哪一個(gè)取決于你的數(shù)據(jù)格式和需求。在Java中,有多個(gè)庫(kù)可以用來執(zhí)行XPath和JsonPath查詢,如javax.xml.xpathcom.jayway.jsonpath等。

在選擇使用哪種表達(dá)式語言時(shí),通常取決于你的應(yīng)用場(chǎng)景和所操作的數(shù)據(jù)類型。如果你在處理XML或JSON數(shù)據(jù),XPath和JsonPath是專門為這些格式設(shè)計(jì)的。而如果你在Spring框架中工作,SpEL將提供更豐富的功能和更大的靈活性。對(duì)于簡(jiǎn)單的Web頁面數(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)文章

  • Java實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 快速掌握J(rèn)ava中注解與反射

    快速掌握J(rèn)ava中注解與反射

    本文詳細(xì)介紹了Java中注解和反射的概念及應(yīng)用,注解是用于給代碼添加元數(shù)據(jù)的標(biāo)記,如@Override、@Deprecated等,反射機(jī)制則是在運(yùn)行時(shí)獲取和操作類的內(nèi)部信息,提高了代碼的靈活度,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • SpringBoot自定義加載yml實(shí)現(xiàn)方式,附源碼解讀

    SpringBoot自定義加載yml實(shí)現(xiàn)方式,附源碼解讀

    這篇文章主要介紹了SpringBoot自定義加載yml實(shí)現(xiàn)方式附源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot屬性注入的兩種方法

    SpringBoot屬性注入的兩種方法

    這篇文章主要介紹了SpringBoot屬性注入的兩種方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • Java實(shí)現(xiàn)XML文件學(xué)生通訊錄

    Java實(shí)現(xiàn)XML文件學(xué)生通訊錄

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)XML文件學(xué)生通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 超詳細(xì)講解SpringBoot參數(shù)校驗(yàn)實(shí)例

    超詳細(xì)講解SpringBoot參數(shù)校驗(yàn)實(shí)例

    經(jīng)常需要提供接口與用戶交互(獲取數(shù)據(jù)、上傳數(shù)據(jù)等),由于這個(gè)過程需要用戶進(jìn)行相關(guān)的操作,為了避免出現(xiàn)一些錯(cuò)誤的數(shù)據(jù)等,一般需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于SpringBoot各種參數(shù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Java設(shè)計(jì)模式中的橋接模式

    Java設(shè)計(jì)模式中的橋接模式

    這篇文章主要介紹了Java設(shè)計(jì)模式中的橋接模式,其是一種結(jié)構(gòu)型設(shè)計(jì)模式,是指將實(shí)現(xiàn)與抽象放在兩個(gè)不同的類層次中,使兩個(gè)層次可以獨(dú)立改變
    2022-07-07
  • 關(guān)于Java錯(cuò)誤提示之找不到或無法加載主類的問題及正確處理方法

    關(guān)于Java錯(cuò)誤提示之找不到或無法加載主類的問題及正確處理方法

    當(dāng)我們?cè)诔鯇W(xué)Java的是時(shí)候,類文件中是不設(shè)定包名(package)的,這種情況下注意classpath,基本上沒有問題,?本文主要說明classpath和系統(tǒng)環(huán)境變量PATH都沒問題的情況下出錯(cuò)原因和正確處理方法,感興趣的朋友一起看看吧
    2022-01-01
  • Java中的集合框架

    Java中的集合框架

    本文主要介紹了Java中集合框架的相關(guān)知識(shí),具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例

    jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例

    這篇文章主要介紹了jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例,需要的朋友可以參考下
    2014-05-05

最新評(píng)論