惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
月光博客
月光博客
博客园 - 司徒正美
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
量子位
Recent Announcements
Recent Announcements
V
V2EX
P
Proofpoint News Feed
小众软件
小众软件
云风的 BLOG
云风的 BLOG
腾讯CDC
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
B
Blog
博客园_首页
GbyAI
GbyAI
博客园 - Franky

博客园 - 半岛拖鞋

Linux下手动安装部署MySQL8.4 Flask JWT简单但完整的项目部署 定位informix oninit进程CPU占用过高的一般步骤 使用Eclipse Memory Analyzer分析java程序占用内存的情况 解决C#连接informix数据库中文乱码 Python手动新建环境 @ApiImplicitParam DataType参数的数据类型 C# Odbc Informix读取中文方法 eclise国内镜像下载地址 Spring Initializr - LSP - Failed to fetch Generation from Spring IO: port out of range: -1 oracle express 18安装后初次登录 linux 查找并批量kill进程 C# 进行用(反)序列化方法实现xml与对象进行互相转换 Alpine Linux添加中文支持显示 VBS字符串在不同编码之间的转换 C#根据wsdl文件生成客户端调用代码 PHP 7.4 checking for libzip 和 failed to open error_log 问题 PHP连接Informix异常 CentOS安装扩展软件支持库
从WebService的SOAP返回数据中获取子级的XML内容
半岛拖鞋 · 2022-10-12 · via 博客园 - 半岛拖鞋

在webservice调用的返回值中,为了传输方便,一般只有一个返回值.这返回值往往是xml或者json格式. 如果用java httpclient方式调用的话, 返回值将是完整的SOAP XML数据返回.如果想获取其中包含的真正的返回值,还需要解析这个xml, 然鹅....在用java自有的xml解析功能时, 在获取body节点(Element/Node)之后, 再获取body的内容时, 只能获取Text内容,并不包含子xml的标签.为解决这个问题我们需要使用到jdom这个jar包.下面举例说明获取xml内容的方式.

下载jdom(JDOM) 或者直接构建maven项目:

<!-- https://mvnrepository.com/artifact/jdom/jdom -->
<dependency>
    <groupId>jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>1.0</version>
</dependency>

假如SOAP 返回值:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
   <soapenv:Body>
      <root>
         <code>0</code>
         <message></message>
         <students>
            <student>
               <name>李二狗</name>
               <classroom>三班</classroom>
               <age>198</age>
               <sex></sex>
            </student>
            <student>
               <name>王丫蛋</name>
               <classroom>四(3)班</classroom>
               <age>19</age>
               <sex></sex>
            </student>
         </students>
      </root>
   </soapenv:Body>
</soapenv:Envelope>

我们的目的是读取<ns:Body>内的root节点的所有xml内容如下:

解析的代码:

import java.io.ByteArrayOutputStream;
import java.io.StringReader;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.junit.jupiter.api.Test;

class PenguinTest {

    @Test
    void test() {
        String soapresp = "";
        soapresp = "<soapenv:Envelope xmlns:soapenv=\"http://www.w3.org/2003/05/soap-envelope\">\r\n"
                + "   <soapenv:Body>\r\n" + "      <root>\r\n" + "         <code>0</code>\r\n"
                + "         <message></message>\r\n" + "         <students>\r\n" + "            <student>\r\n"
                + "               <name>李二狗</name>\r\n" + "               <classroom>三班</classroom>\r\n"
                + "               <age>198</age>\r\n" + "               <sex>男</sex>\r\n" + "            </student>\r\n"
                + "            <student>\r\n" + "               <name>王丫蛋</name>\r\n"
                + "               <classroom>四(3)班</classroom>\r\n" + "               <age>19</age>\r\n"
                + "               <sex>女</sex>\r\n" + "            </student>\r\n" + "         </students>\r\n"
                + "      </root>\r\n" + "   </soapenv:Body>\r\n" + "</soapenv:Envelope>";
        SAXBuilder saxBuilder = new SAXBuilder();
        StringReader reader = new StringReader(soapresp);
        Document build = null;
        try {
            build = saxBuilder.build(reader);
            // 读取root节点
            Element body = (Element) build.getRootElement().getChildren().get(0); // ns:Body            
            Element root = (Element) body.getChildren().get(0);
            

            // Element 转 XML  String
            XMLOutputter xmlout = new XMLOutputter();
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            xmlout.output(root, bo); // 把Element 写入 ByteArrayOutputStream 中
            String rootXml = bo.toString();
            bo.close();
            System.out.println(rootXml);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

得到的结果如下:

<root>
         <code>0</code>
         <message />
         <students>
            <student>
               <name>李二狗</name>
               <classroom>三班</classroom>
               <age>198</age>
               <sex></sex>
            </student>
            <student>
               <name>王丫蛋</name>
               <classroom>四(3)班</classroom>
               <age>19</age>
               <sex></sex>
            </student>
         </students>
      </root>