Java中如何通过路径表达式找值:XPath和JsonPath以及SpEL详解及对比

大家好,我是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 依赖包的方法,还有另外一个依赖包可以处理,官网学习地址:https://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是一个轻量级且易于使用的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/162909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CI/CD -gitlab

目录 一、常用命令 二、部署 一、常用命令 官网&#xff1a;https://about.gitlab.com/install/ gitlab-ctl start # 启动所有 gitlab 组件 gitlab-ctl stop # 停止所有 gitlab 组件 gitlab-ctl restart # 重启所有 gitlab 组件 gitlab-ctl statu…

比Postman强在哪里

Postman的受众对象主要是广大开发人员&#xff0c;调测使用&#xff0c;它并不能完全满足专业测试人员需求&#xff0c;而自动化测试平台可以 1&#xff0c;Postman&#xff0c;Jmter是单机版软件&#xff0c;类似打游戏你和电脑PK&#xff0c;而很多时候是要联网和其他人团队作…

软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?

软件开发、网络空间安全、人工智能这三个方向都是当前及未来的热门领域&#xff0c;每个领域都有各自的就业前景和价值&#xff0c;以下是对这三个方向的分析&#xff1a; 1、软件开发&#xff1a; 就业前景&#xff1a;随着信息化的加速&#xff0c;软件开发的需求日益增长。…

【PyQt小知识 - 3】: QComboBox下拉框内容的设置和更新、默认值的设置、值和下标的获取

QComboBox 内容的设置和更新 from PyQt5.QtWidgets import * import sysapp QApplication(sys.argv)mainwindow QMainWindow() mainwindow.resize(200, 200) # 设置下拉框 comboBox QComboBox(mainwindow) comboBox.addItems([上, 中, 下])button QPushButton(更新, main…

Django学习日志03

数据的增删改查&#xff08;insert update delete select&#xff09; 1. 用户列表的展示 # 把数据表中得用户数据都给查询出来展示在页面上 添加数据 id username password gender age action …

Web与DNS综合实验

目录 题目&#xff1a; 步骤一&#xff1a;准备工作 步骤二&#xff1a;在server端搭建简单网页 步骤三&#xff1a;node1端的DNS解析配置 步骤五&#xff1a;node2端进行测试。 题目&#xff1a; 1.打开3个主机&#xff0c;server、node1、node2 2.server为web主机建立网…

如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中?

文章目录 1. 介绍2. 准备工作3. 将 Docsify 项目上传至服务器4. 在服务器上安装 Node.js5. 在服务器上运行 Docsify6. 配置 Nginx 反向代理7. 访问 Docsify 文档8. 拓展8.1 配置 HTTPS8.2 定制 Docsify 主题8.3 鉴权和访问控制 &#x1f389;如何将 Docsify 项目部署到 CentOS …

​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第20章 系统架构设计师论文写作要点&#xff08;P717~728&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

图片标注工具Labelme的安装及使用方法

参考&#xff1a;图像语义分割标注工具labelme制作自己的数据集用于mask-rcnn训练_ZealCV的博客-CSDN博客_语义分割标注工具 在做目标检测任务时&#xff0c;需要用到labelImg进行画框标注&#xff0c;在之前的文章中已经介绍过该工具的使用方法。然而如果是做语义分割的任务时…

Linux命令之查看文件和权限修改操作

目录 查看文件 1. cat --- 将文件中的内容打印在输出设备 2. more --- 分页显示文件内容 3.less ---查看文件内容 4. head -- 查看文件前n行内容 5.tail -- 查看指定文件的后n行内容或实时监测文件 6. wc -- 可计算文件的字节数、字数和列数 文件搜索 1.which --- 获取…

大数据可视化是什么?

大数据可视化是将海量数据通过视觉方式呈现出来&#xff0c;以便于人们理解和分析数据的过程。它可以帮人们发现数据之间的关系、趋势和模式&#xff0c;并制定更明智的决策。大数据可视化通常通过图形、图表、地图和仪表盘等视觉元素来呈现数据。这些元素具有直观、易理解的特…

Prompt 编程的设计技巧

大家好&#xff0c;我是木川 《Prompt 编程》即利用 GPT 模型的能力实现编程效果&#xff0c;《Prompt 编程》最早是由菠菜老师提出&#xff0c;本文基于 《Prompt 编程》的概念及自己的一些感想&#xff0c;总结了下《 Prompt 编程》的设计技巧 一、结构化 针对复杂的 Prompt&…

sqli-labs(2)

7. 输入?id1 --显示格式错误 ?id1" --正常 测试 ?id1“ and sleep(5) -- 发现并没有成功 ?id1) --显示格式错误继续尝试 ?id1)) -- 显示正常 测试 ?id1“ and sleep(5) -- 发现sleep执行 对于语句闭合的尝试主要从 " ()来测试 报错语句尝试发现不回显报错信息…

Solidity基础语法代码2

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* 哈希算法具有两个特性&#xff1a; 1. 输入值相同&#xff0c;输出值一定相同 2. 不管输入值有多大&#xff0c;输出值是定长的&#xff0c;并且哈希算法是不可逆向运算的 通常把哈希算法用在签名运算&#xff0…

在网页中添加水印的实现方法

在网页设计中&#xff0c;为了保护内容的版权以及增加一些特殊效果&#xff0c;经常需要在页面上添加水印。本文将介绍一种通过Canvas和JavaScript实现在网页上添加水印的方法。 功能&#xff1a; 允许自定义水印内容、字体颜色可以防止用户删除水印元素、修改样式等其他手段…

基于原子搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于原子搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

windows安装Git【超详细图解】

目录 git安装地址 git配置 提交代码时使用的命令 git安装地址 Git for WindowsWe bring the awesome Git VCS to Windowshttps://gitforwindows.org/ 打开终端&#xff0c;输入git --version git配置 git config --global user.name "用户名" git config --g…

镀膜与干刻中的平均自由程是什么?

在芯片制造中&#xff0c;镀膜和干刻是其中的重要环节&#xff0c;通常要用到CVD&#xff0c;RIE等技术&#xff0c;对材料表面进行纳米级的精细操作。在这些工序中&#xff0c;原子&#xff0c;分子&#xff0c;离子等&#xff0c;会在气体或真空中进行自由运动&#xff0c;直…

基础模型的自然语言处理能力综述

NLP作为一个领域为基础模型开辟了道路。虽然这些模型在标准基准测试中占据主导地位&#xff0c;但这些模型目前获得的能力与那些将语言描述为人类交流和思维的复杂系统的能力之间存在明显的差距。针对这一点&#xff0c;我们强调语言变异的全部范围&#xff08;例如&#xff0c…

Yolov5安装运行过程中出现的问题

Yolov5安装运行过程中出现的问题合集 安装问题pip 安装 requirements.txtcmd下如何退出python&#xff1f;升级numpy protobuf版本过高AttributeError: Can’t get attribute ‘SPPF’ on <module ‘models.common’ from 地址找不到图片NameError: name warnings is not de…