淺析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è)路徑定位到的,那么它們具體是怎么通過路徑定位到具體的值呢?
今天咱們就來聊一聊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ì)比分析
特性 | XPath | JsonPath | SpEL | EL |
---|---|---|---|---|
數(shù)據(jù)格式 | XML | JSON | 任意 | 任意 |
查詢語法 | 結(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é)
XPath和JsonPath都是強(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.xpath
和com.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)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07SpringBoot自定義加載yml實(shí)現(xiàn)方式,附源碼解讀
這篇文章主要介紹了SpringBoot自定義加載yml實(shí)現(xiàn)方式附源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java實(shí)現(xiàn)XML文件學(xué)生通訊錄
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)XML文件學(xué)生通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02超詳細(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關(guān)于Java錯(cuò)誤提示之找不到或無法加載主類的問題及正確處理方法
當(dāng)我們?cè)诔鯇W(xué)Java的是時(shí)候,類文件中是不設(shè)定包名(package)的,這種情況下注意classpath,基本上沒有問題,?本文主要說明classpath和系統(tǒng)環(huán)境變量PATH都沒問題的情況下出錯(cuò)原因和正確處理方法,感興趣的朋友一起看看吧2022-01-01jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例
這篇文章主要介紹了jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例,需要的朋友可以參考下2014-05-05