浅析Java中XPath和JsonPath以及SpEL的用法与对比

 更新时间:2023年11月20日 08:16:40   作者:G探险者  
XPath,即XML路径语言,是一种用于在XML文档中查找信息的语言,JsonPath是从XPath中发展而来的,专门用于JSON数据格式,本文主要来讲讲他们的用法与区别,需要的可以参考下

大家好,我是G探险者。

我们编程时,在前后端数据交互和传输过程中,往往需要对报文中的某个字段或者某个标签的值进行解析读取,报文通常是以json或者xml作为数据交换格式,而json和xml这两种格式的报文结构都是具备一定的层级关系的,也就是说我们要想要拿到报文里面的某个值,是可以通过一个路径定位到的,那么它们具体是怎么通过路径定位到具体的值呢?

今天咱们就来聊一聊XPath和JsonPath.

1. XPath

XPath,即XML路径语言,是一种用于在XML文档中查找信息的语言。它使用路径表达式来选取XML文档中的节点或节点集。这些路径表达式看起来很像文件系统中的路径,旨在快速地定位和操作文档中的元素。

特点

  • 数据格式: 专用于XML。
  • 查询结构: /root/child/grandchild的形式,非常结构化。
  • 表达式能力: 支持逻辑运算、算术运算和内置函数。
  • 使用场景: 主要用于XML文档的导航和查询。

示例代码

假设有以下XML报文:

<books>
   <book>
      <title>Java Programming</title>
      <author>James Gosling</author>
   </book>
   <book>
      <title>XML Fundamentals</title>
      <author>John Doe</author>
   </book>
</books>

使用XPath找到所有书籍的标题:

// 导入所需的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;

// ...

// 创建DocumentBuilderFactory实例以解析XML文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder实例
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML文档,这里假设文件名为books.xml
Document doc = builder.parse("books.xml");
// 创建XPath实例来查询XML文档
XPath xpath = XPathFactory.newInstance().newXPath();
// XPath表达式,用来选择所有的<title>元素
String expression = "/books/book/title";
// 执行XPath查询并获取结果节点列表
NodeList titles = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);

// 遍历结果节点列表并打印每个<title>元素的文本内容
for (int i = 0; i < titles.getLength(); i++) {
    System.out.println(titles.item(i).getTextContent());
}

2. JsonPath

JsonPath是从XPath中发展而来的,专门用于JSON数据格式。它提供了一种简单的方法来使用类似XPath的语法,从JSON对象中提取所需的信息。

特点

  • 数据格式: 专用于JSON。
  • 查询结构: 使用点记法(例如$.object.property)或数组记法(例如$['object']['property'])。
  • 表达式能力: 简单,主要用于定位和过滤数据。
  • 使用场景: 处理RESTful服务返回的JSON数据,以及其他JSON数据处理。

示例代码

假设有如下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获取所有书籍的标题:

首先需要引入这个依赖:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.8.0</version>
</dependency>
// 导入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表达式,用来选取所有书籍的标题
String jsonPathExpression = "$.store.book[*].title";
// 执行JsonPath查询并获取结果为JSONArray
JSONArray bookTitles = JsonPath.read(json, jsonPathExpression);
// 遍历JSONArray并打印每本书的标题
for (Object title : bookTitles) {
    System.out.println(title);
}

除了上面这个com.jayway.jsonpath 依赖包的方法,还有另外一个依赖包可以处理,官网学习地址:github.com/noear/snack3

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>snack3</artifactId>
</<dependency>

3. 拓展

除了以上的XPath和JsonPath,其实还有类似的路径表达式是来从对象中获取某个值 SpEL(Spring Expression Language)和EL(Expression Language)通常用于在Java企业应用中进行动态查询和管理应用程序的行为。 SpEL是Spring框架提供的一种功能强大的表达式语言,而EL最初是为了简化JSP页面的数据展示而生,后来也被整合到了JSF和其他Java企业技术中。

3.1 SpEL

  • 数据格式: 不依赖特定数据格式,可以用于对象图导航。
  • 查询结构: 使用类似于JsonPath的点记法,如@beanName.method()
  • 表达式能力: 非常强大,支持方法调用、关系运算、正则表达式匹配等。
  • 使用场景: 在Spring框架中进行配置、验证、模板操作等,非常灵活。

示例代码:

import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.Expression;

// 创建一个表达式解析器
ExpressionParser parser = new SpelExpressionParser();

// 解析一个字符串表达式,并执行字符串拼接
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();

// 输出结果,将打印:Hello World!
System.out.println(message);

3.2 EL

  • 数据格式: 不依赖特定数据格式,通常用于访问JavaBeans对象。
  • 查询结构: 使用${object.property}的形式,主要用于Web层。
  • 表达式能力: 相对简单,支持简单的属性访问和算术操作。
  • 使用场景: 主要用于JSP和JSF等Java EE技术中,用于简化页面层的数据展示。
import javax.el.ELProcessor;

// 创建ELProcessor实例
ELProcessor elProcessor = new ELProcessor();

// 定义一个变量并赋值
elProcessor.setValue("greeting", "Hello");

// 使用EL表达式拼接字符串
String result = (String) elProcessor.eval("greeting.concat(' World!')");

// 输出结果,将打印:Hello World!
System.out.println(result);

4. 对比分析

特性XPathJsonPathSpELEL
数据格式XMLJSON任意任意
查询语法结构化路径点记法/数组记法点记法/方法调用简化属性访问
表达式能力逻辑/算术运算定位/过滤方法调用/正则表达式简单属性/算术
使用场景XML文档查询JSON数据处理Spring应用JSP/JSF页面

5. 总结

XPathJsonPath都是强大的查询语言,它们使得从复杂的数据结构中提取信息变得更加容易。XPath适用于XML数据,而JsonPath适用于JSON数据。两者各有优势,具体使用哪一个取决于你的数据格式和需求。在Java中,有多个库可以用来执行XPath和JsonPath查询,如javax.xml.xpathcom.jayway.jsonpath等。

在选择使用哪种表达式语言时,通常取决于你的应用场景和所操作的数据类型。如果你在处理XML或JSON数据,XPath和JsonPath是专门为这些格式设计的。而如果你在Spring框架中工作,SpEL将提供更丰富的功能和更大的灵活性。对于简单的Web页面数据展示,EL是一个轻量级且易于使用的选择。

到此这篇关于浅析Java中XPath和JsonPath以及SpEL的用法与对比的文章就介绍到这了,更多相关Java XPath JsonPath内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java线程并发控制同步工具CountDownLatch

    java线程并发控制同步工具CountDownLatch

    这篇文章主要为大家介绍了java线程并发控制同步工具CountDownLatch使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 解决mybatis-plus自定义xml的坑

    解决mybatis-plus自定义xml的坑

    这篇文章主要介绍了解决mybatis-plus自定义xml的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • springboot+vue+elementsUI实现分角色注册登录界面功能

    springboot+vue+elementsUI实现分角色注册登录界面功能

    这篇文章主要给大家介绍了关于springboot+vue+elementsUI实现分角色注册登录界面功能的相关资料,Spring Boot和Vue.js是两个非常流行的开源框架,可以用来构建Web应用程序,需要的朋友可以参考下
    2023-07-07
  • SpringCloud使用Zookeeper作为注册中心

    SpringCloud使用Zookeeper作为注册中心

    这篇文章主要介绍了SpringCloud如何使用Zookeeper作为注册中心,帮助大家更好的理解和学习使用Zookeeper,感兴趣的朋友可以了解下
    2021-04-04
  • Java中输入与输出的方法总结

    Java中输入与输出的方法总结

    这篇文章主要为大家总结了一下Java中输入与输出的三种方法,文中通过示例详细的讲解了一下这些方法的使用,需要的小伙伴可以参考一下
    2022-04-04
  • java Arrays类详解及实例代码

    java Arrays类详解及实例代码

    这篇文章主要介绍了java Arrays类详解及实例代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • springBoot @Scheduled实现多个任务同时开始执行

    springBoot @Scheduled实现多个任务同时开始执行

    这篇文章主要介绍了springBoot @Scheduled实现多个任务同时开始执行,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Springboot接口项目如何使用AOP记录日志

    Springboot接口项目如何使用AOP记录日志

    这篇文章主要介绍了Springboot接口项目如何使用AOP记录日志,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java中Calendar日历类型常见方法详解

    Java中Calendar日历类型常见方法详解

    Calendar是Java中常用的时间处理工具之一,它提供了很多日历类型常见方法,下面是一些常用的方法及对应的代码和运行结果,感兴趣的朋友一起看看吧
    2023-11-11
  • java解析dbf之通过javadbf包生成和读取dbf文件

    java解析dbf之通过javadbf包生成和读取dbf文件

    这篇文章主要介绍了java通过javadbf读取和生成DBF文件的方法,大家参考使用吧
    2014-01-01

最新评论