松江建设投资有限公司网站,WordPress即时群聊,电商运营团队,广告设计公司深圳策划设计公司大家好#xff0c;我是G探险者。
我们编程时#xff0c;在前后端数据交互和传输过程中#xff0c;往往需要对报文中的某个字段或者某个标签的值进行解析读取#xff0c;报文通常是以json或者xml作为数据交换格式#xff0c;而json和xml这两种格式的报文结构都是具备一定的…大家好我是G探险者。
我们编程时在前后端数据交互和传输过程中往往需要对报文中的某个字段或者某个标签的值进行解析读取报文通常是以json或者xml作为数据交换格式而json和xml这两种格式的报文结构都是具备一定的层级关系的也就是说我们要想要拿到报文里面的某个值是可以通过一个路径定位到的那么它们具体是怎么通过路径定位到具体的值呢
今天咱们就来聊一聊XPath和JsonPath. 1. XPath
XPath即XML路径语言是一种用于在XML文档中查找信息的语言。它使用路径表达式来选取XML文档中的节点或节点集。这些路径表达式看起来很像文件系统中的路径旨在快速地定位和操作文档中的元素。
特点
数据格式: 专用于XML。查询结构: /root/child/grandchild的形式非常结构化。表达式能力: 支持逻辑运算、算术运算和内置函数。使用场景: 主要用于XML文档的导航和查询。
示例代码
假设有以下XML报文
booksbooktitleJava Programming/titleauthorJames Gosling/author/bookbooktitleXML Fundamentals/titleauthorJohn 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获取所有书籍的标题
首先需要引入这个依赖
dependencygroupIdcom.jayway.jsonpath/groupIdartifactIdjson-path/artifactIdversion2.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 dependencygroupIdorg.noear/groupIdartifactIdsnack3/artifactId
/dependency3. 拓展
除了以上的XPath和JsonPath其实还有类似的路径表达式是来从对象中获取某个值 SpELSpring Expression Language和ELExpression 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. 总结
XPath和JsonPath都是强大的查询语言它们使得从复杂的数据结构中提取信息变得更加容易。XPath适用于XML数据而JsonPath适用于JSON数据。两者各有优势具体使用哪一个取决于你的数据格式和需求。在Java中有多个库可以用来执行XPath和JsonPath查询如javax.xml.xpath和com.jayway.jsonpath等。
在选择使用哪种表达式语言时通常取决于你的应用场景和所操作的数据类型。如果你在处理XML或JSON数据XPath和JsonPath是专门为这些格式设计的。而如果你在Spring框架中工作SpEL将提供更丰富的功能和更大的灵活性。对于简单的Web页面数据展示EL是一个轻量级且易于使用的选择。