大家好,我是G探险者。
我们编程时,在前后端数据交互和传输过程中,往往需要对报文中的某个字段或者某个标签的值进行解析读取,报文通常是以json或者xml作为数据交换格式,而json和xml这两种格式的报文结构都是具备一定的层级关系的,也就是说我们要想要拿到报文里面的某个值,是可以通过一个路径定位到的,那么它们具体是怎么通过路径定位到具体的值呢?
今天咱们就来聊一聊XPath和JsonPath.
1. XPath
XPath,即XML路径语言,是一种用于在XML文档中查找信息的语言。它使用路径表达式来选取XML文档中的节点或节点集。这些路径表达式看起来很像文件系统中的路径,旨在快速地定位和操作文档中的元素。
特点
- 数据格式: 专用于XML。
-
查询结构:
/root/child/grandchild
的形式,非常结构化。 - 表达式能力: 支持逻辑运算、算术运算和内置函数。
- 使用场景: 主要用于XML文档的导航和查询。
示例代码
假设有以下XML报文:
Java Programming
James Gosling
XML Fundamentals
John Doe
使用XPath找到所有书籍的标题:
// 导入所需的XML处理库
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importorg.w3c.dom.Document;
importjavax.xml.xpath.XPath;
importjavax.xml.xpath.XPathFactory;
importjavax.xml.xpath.XPathConstants;
importorg.w3c.dom.NodeList;
// ...
// 创建DocumentBuilderFactory实例以解析XML文档
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder实例
DocumentBuilderbuilder=factory.newDocumentBuilder();
// 解析XML文档,这里假设文件名为books.xml
Documentdoc=builder.parse("books.xml");
// 创建XPath实例来查询XML文档
XPathxpath=XPathFactory.newInstance().newXPath();
// XPath表达式,用来选择所有的元素
Stringexpression="/books/book/title";
// 执行XPath查询并获取结果节点列表
NodeListtitles=(NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);
// 遍历结果节点列表并打印每个元素的文本内容
for(inti=0; i
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获取所有书籍的标题:
首先需要引入这个依赖:
com.jayway.jsonpath
json-path
2.8.0
// 导入JsonPath库
importcom.jayway.jsonpath.JsonPath;
importnet.minidev.js服务器托管网on.JSONArray;
// ...
// JSON字符串,表示一个书店的存货,包括书籍和自行车
Stringjson="{ "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表达式,用来选取所有书籍的标题
StringjsonPathExpression="$.store.book[*].title";
// 执行JsonPath查询并获取结果为JSONArray
JSONArraybookTitles=JsonPath.read(json, jsonPathExpression);
// 遍历JSONArray并打印每本书的标题
for(Object title : bookTitles) {
System.out.println(title);
}
除了上面这个com.jayway.jsonpath 依赖包的方法,还有另外一个依赖包可以处理,官网学习地址:https://github.com/noear/snack3
org.noear
snack3
3. 拓展
除了以上的XPath和JsonPath,其实还有类似的路径表达式是来从对象中获取某个值
SpEL(Spring Expression Language)和EL(Expression Language)通常用于在Java企业应用中进行动态查询和管理应用程序的行为。
SpEL是Spring框架提供的一种功能强大的表达式语言,而EL最初是为了简化JSP页面的数据展示而生,后来也被整合到了JSF和其他Java企业技术中。
3.1 SpEL
- 数据格式: 不依赖特定数据格式,可以用于对象图导航。
-
查询结构: 使用类似于JsonPath的点记法,如
@beanName.method()
。 - 表达式能力: 非常强大,支持方法调用、关系运算、正则表达式匹配等。
- 使用场景: 在Spring框架中进行配置、验证、模板操作等,非常灵活。
示例代码:
importorg.springframework.expression.ExpressionParser;
importorg.springframework.expression.spel.standard.SpelExpressionParser;
importorg.springframework.expression.Expression;
// 创建一个表达式解析器
ExpressionParserparser=newSpelExpressionParser();
// 解析一个字符串表达式,并执行字符串拼接
Expressionexp=parser.parseExpression("'Hello World'.concat('!')");
Stringmessage=(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. 对比分析
特性 | XPath | JsonPath | SpEL | EL |
---|---|---|---|---|
数据格式 | XML | JSON | 任意 | 任意 |
查询语法 | 结构化路径 | 点记法/数组记法 | 点记法/方法调用 | 简化属性访问 |
表达式能力 | 逻辑/算术运算 | 定位/过滤 | 方法调用/正则表达式 | 简单属性/算术 |
使用场景 | XML文档查询 | JSON数据处理 | Spring应用 | JSP/JSF页面 |
5. 总结
XPath和JsonPath都是强大的查询语言,它们使得从复杂的数据结构中提取信息变得更加容易。XPath适用于XML数据,而JsonPath适用于JSON数据。两者各有优势,具体使用哪一个取决于你的数据格式和需求。在Java中,有多个库可以用来执行XPath和JsonPath查询,如javax.xml.xpath
和com.jayw服务器托管网ay.jsonpath
等。
在选择使用哪种表达式语言时,通常取决于你的应用场景和所操作的数据类型。如果你在处理XML或JSON数据,XPath和JsonPath是专门为这些格式设计的。而如果你在Spring框架中工作,SpEL将提供更丰富的功能和更大的灵活性。对于简单的Web页面数据展示,EL是一个轻量级且易于使用的选择。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net