Java 发送和解析Soap Xml数据

最近项目上遇到了一个需要对接客户Soap系统,查看他们C#源码发现格式如下,与之前用过的Xml数据还不太一样,于是又研究了下如何封装。

 请求数据

                String sendMsg="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                    "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
                    "  <soap:Body>\n" +
                    "    <GetUserInfo xmlns=\"http://tempuri.org/\">\n" +
                    "      <code>103431</code>\n" +
                    "      <pwd>19</pwd>\n" +
                    "    </GetUserInfo>\n" +
                    "  </soap:Body>\n" +
                    "</soap:Envelope>";

请求方法

    /**
     * 拼接请求体
     * @param table 表面
     * @param fields 参数键值对 name:key value:value
     * @return 拼接后xml
     */
    public static String requestWeb(String table, Map<String, String> fields) {
        String fieldsMsg = "";
        for (Map.Entry<String, String> entry : fields.entrySet()) {
            fieldsMsg += "<" + entry.getKey() + ">" + entry.getValue() + "</" + entry.getKey() + ">";
        }
        String sendMsg = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
                "  <soap:Body>\n" +
                "    <" + table + " xmlns=\"http://tempuri.org/\">\n" +
                fieldsMsg +
                "    </" + table + ">\n" +
                "  </soap:Body>\n" +
                "</soap:Envelope>";
        return sendMsg;
    }


            //表名
            String table="GetUserInfo";
            Map<String, String> fields = new HashMap<>();
            //参数
            fields.put("code", username);
            fields.put("pwd", password);
            String sendMsg = SoapUtils.requestWeb(table, fields);
//发送请求时需要加上.mediaType(MediaType.parse("text/xml; charset=utf-8"))

 解析数据使用 dom4j

有两种数据格式,单数据(如获取用户信息),列表数据(获取单据信息)

    /**
     * 解析SOAP返回数据
     * @param response 数据源
     * @param table 表名
     * @return Map;空数据返回null
     * 单数据形式
     * <XXResponse>
     *     <XXResult>
     *         <ID></ID>
     *         <NAME></NAME>
     *     </XXResult>
     * </XXResponse>
     */
    public static Map<String, String> responseWeb(String response, String table) {
        //创建Reader对象
        SAXReader reader = new SAXReader();
        //加载xml
        Document document = null;
        Map<String, String> request = new HashMap();
        try {
            //获取数据流
            InputStream is = new ByteArrayInputStream(response.getBytes());
            document = reader.read(is);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //获取根节点
        Element rootElement = document.getRootElement();
        Iterator iterator = rootElement.elementIterator();
        while (iterator.hasNext()) {
            request = new HashMap();
            Element stu = (Element) iterator.next();
            //判断节点是否为Result 如果不是则向下遍历
            while (!stu.getName().equals((table + "Result"))) {
                if (stu.elementIterator().hasNext()) {
                    stu = stu.elementIterator().next();
                }else {
                    return null;
                }
            }
//            List<Attribute> attributes = stu.attributes();
//            System.out.println("======获取属性值======");
//            for (Attribute attribute : attributes) {
//                System.out.println(attribute.getValue());
//            }
            Log.d(TAG, "responseWeb: ======遍历子节点======");
            Iterator iterator1 = stu.elementIterator();
            while (iterator1.hasNext()) {
                Element stuChild = (Element) iterator1.next();
                Log.d(TAG, "节点名:" + stuChild.getName() + "---节点值:" + stuChild.getStringValue());
                request.put(stuChild.getName(), stuChild.getStringValue());
            }
        }
        return request;
    }
    /**
     * 解析SOAP返回数据
     *
     * @param response 数据源
     * @param table    表名
     * @return List Map;空数据返回null
     * list数据形式
     * <XXResponse>
     *     <XXResult>
     *         <T_XX_XX>
     *             <ID></ID>
     *             <NAME></NAME>
     *         </T_XX_XX>
     *         <T_XX_XX>
     *             <ID></ID>
     *             <NAME></NAME>
     *         </T_XX_XX>
     *     </XXResult>
     * </XXResponse>
     */
    public static List<Map<String, String>> responseWebList(String response, String table) {
        //创建Reader对象
        SAXReader reader = new SAXReader();
        //加载xml
        Document document = null;
        List<Map<String, String>> requestList = new ArrayList<>();
        Map<String, String> request = new HashMap();
        try {
            //获取数据流
            InputStream is = new ByteArrayInputStream(response.getBytes());
            document = reader.read(is);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //获取根节点
        Element rootElement = document.getRootElement();
        Iterator iterator = rootElement.elementIterator();
        while (iterator.hasNext()) {
            Element stu = (Element) iterator.next();
            //判断节点是否为Result 如果不是则向下遍历
            while (!stu.getName().equals((table + "Result"))) {
                if (stu.elementIterator().hasNext()) {
                    stu = stu.elementIterator().next();
                } else {
                    return null;
                }
            }
//            List<Attribute> attributes = stu.attributes();
//            System.out.println("======获取属性值======");
//            for (Attribute attribute : attributes) {
//                System.out.println(attribute.getValue());
//            }
            Log.d(TAG, "responseWebList: ======遍历子节点======");
            Iterator iterator1 = stu.elementIterator();
            while (iterator1.hasNext()) {
                Element stuChild = (Element) iterator1.next();
                if (stuChild.elementIterator().hasNext()) {
                    Log.d(TAG, "responseWebList: ======遍历孙节点======");
                    Iterator iterator2 = stuChild.elementIterator();
                    request = new HashMap();
                    while (iterator2.hasNext()) {
                        Element stuSon = (Element) iterator2.next();
                        Log.d(TAG, "节点名:" + stuSon.getName() + "---节点值:" + stuSon.getStringValue());
                        request.put(stuSon.getName(), stuSon.getStringValue());
                    }
                }
                requestList.add(request);
            }
        }
        return requestList;
    }


 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java发送SOAP报文,可以使用SOAP协议和相关的Java库来实现。 首先,你需要使用Java的Web服务相关的库来创建一个SOAP客户端。最常用的库是JAX-WS(Java API for XML Web Services)和Apache Axis。这些库提供了方便的API,用于创建和发送SOAP报文。 在使用这些库之前,你需要先定义一个WSDL(Web Services Description Language)文件,其中描述了你的SOAP服务的接口和操作。你可以使用WSDL编辑器或者手动编写WSDL文件。然后,利用JAX-WS提供的工具来生成Java类,这些类将用于创建和解析SOAP报文。 接下来,你需要创建一个SOAP客户端。使用生成的Java类,你可以通过调用相应的方法来构建SOAP请求报文。然后,将构建的SOAP请求报文发送SOAP服务的URL。这可以通过在Java程序中使用HTTP连接来实现。你可以使用Java提供的URLConnection或Apache HttpClient等库来发送HTTP请求,并将SOAP请求作为HTTP请求的正文发送。 最后,你需要处理SOAP服务返回的SOAP响应报文。通过解析SOAP响应报文,你可以提取其中的数据并进行相应的处理。 总结起来,实现Java发送SOAP报文的步骤包括: 1. 定义WSDL文件描述SOAP服务接口和操作。 2. 使用JAX-WS生成Java类。 3. 创建SOAP客户端,构建SOAP请求报文,并发送SOAP服务的URL。 4. 处理SOAP服务的响应报文,提取数据并进行相应的处理。 以上是一个简单的概述,实际的实现可能会涉及更多的细节和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值