背景:
在调用京东万象的短信接口的时候,它返回的是json格式的字符串,使用的是京东万象的106短信
接口(https://wx.jdcloud.com/market/datas/5/10306)
解析xml的两种方式进行比较:
1.DOM解析(DOM解析它是一次性将要解析的文件加载到内存,然后再进行解析)
2.SAX解析(SAX解析它是边读边解析)
总结:DOM解析不仅能读xml数据,还可以对其内容的节点进行增删改,而SAX解析只能读文件使用,所以使用DOM解析,DOM解析使用的是dom4j+xpath方式
XPath中如何使用路径表达式:
xml案例:
// 其中bookstore是根节点,book节点是bookstore节点的子节点,title节点和price节点是bookstore节点的后代节点
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.98</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
路径表达式如下:
表达式 描述
节点名称 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
在上面的xml文档案例上使用路径表达式:
路径表达式 结果
bookstore 选取bookstore元素的所有子节点
/bookstore 选取根元素bookstore
bookstore/book 选取bookstore的子元素中的所有book元素
//book 选取所有book子元素,而不管他们在文档中的位置
bookstore//book 选取bookstore元素的后代的所有book元素,而不管他们位于bookstore之下的什么位置
//@lang 选取名为lang的所有属性
/bookstore/book[1] 选取属于bookstore子元素的第一个book元素
/bookstore/book[last()] 选取属于bookstore子元素中的最后一个book元素
/bookstore/book[last()-1] 选取属于bookstore子元素中的倒数第二个book元素
/bookstore/book[position()<3] 选取属于bookstore子元素中的前二个book元素
//title[@lang] 选取所有属性名称为lang的元素
//title[@lang='eng'] 选取所有属性名称为lang,并且属性值为eng的元素
/bookstore/book[price>35.00] 选取bookstore的子元素中的所有book元素,并且其中price元素的值必须大于35.00
/bookstore/book[price>35.00]/title 选取bookstore的子元素中的所有book元素中的所有title元素,并且其中price元素的值必须大于35.00
如何使用DOM解析:
1、引入依赖
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.0</version>
</dependency>
上面是dom4j的依赖,如果使用Maven工具,那就不需要引入xpath的依赖了,因为dom4j需要xpath依赖,所以Maven工具会帮我们引入;如果没有使用Maven工具,那还需要引入一个依赖叫:jaxen.jar,该jar包的作用是支持xpath语法的jar包
2、编写后端代码
// 这是json字符串里面包含xml字符串,可以从“**********解析xml格式的字符串开始***********”该注释处开始看解析xml字符串的方法
String jsonString = "{\n" +
" \"code\": \"10000\",\n" +
" \"charge\": false,\n" +
" \"remain\": 0,\n" +
" \"msg\": \"查询成功\",\n" +
" \"result\": \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\" ?><returnsms>\\n <returnstatus>Success</returnstatus>\\n <message>ok</message>\\n <remainpoint>-1333773</remainpoint>\\n <taskID>112459829</taskID>\\n <successCounts>1</successCounts></returnsms>\"\n" +
"}";
// 将json格式的字符串转换为json对象
JSONObject jsonObject = JSONObject.parseObject(jsonString);
// 获取通信标识
String code = jsonObject.getString("code");
//判断通信是否成功
if (!StringUtils.equals("10000", code)) {
return Result.error("短信平台通信异常");
}
// 获取业务处理结果result,result中存储的就是xml格式的字符串
String resultXml = jsonObject.getString("result");
// **********解析xml格式的字符串开始***********
// 将xml格式的字符串转换成Document对象
Document document = DocumentHelper.parseText(resultXml);
// 获取returnstatus节点对象
Node returnstatusNode = document.selectSingleNode("//returnstatus");
// 通过returnstatus节点对象获取该节点对象的内容
String text = returnstatusNode.getText();
// 判断短信是否发送成功
if (!StringUtils.equals(text, "Success")) {
return Result.error("短信平台发送失败");
}
// 处理业务代码
3、java后端解析json字符串(地址:https://blog.csdn.net/qq_42449963/article/details/105394602)