java后台解析xml格式字符串

背景:
在调用京东万象的短信接口的时候,它返回的是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

发布了177 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42449963/article/details/105395517