Java解析.net asmx Soap返回包

背景

用.net asmx写webservice时,返回结果是xml格式,向下面这样:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <ProcessResponse xmlns="http://tempuri.org/">
      <ProcessResult>{"IsSuccess":true,"Body":{"msg":"成功","code":"1","sub_msg":"","sub_code":"","biz_data":{"message":"00000000000000034738","statusCode":200}}}</ProcessResult>
    </ProcessResponse>
  </soap:Body>
</soap:Envelope>

用.net 反序列化或者.net解析xml方式来解析这个结果都很方便。但是如果调用方使用的Java开发,则需要用Java来解析这个结果了。

解决办法

使用dom4j包来解析xml,解析上面的报文,也很简单,直接上代码:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Main {

    public static void main(final String[] args) {
        try {

            String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><ProcessResponse xmlns=\"http://tempuri.org/\"><ProcessResult>{\"IsSuccess\":true,\"Body\":{\"msg\":\"成功\",\"code\":\"1\",\"sub_msg\":\"\",\"sub_code\":\"\",\"biz_data\":{\"message\":\"00000000000000034738\",\"statusCode\":200}}}</ProcessResult></ProcessResponse></soap:Body></soap:Envelope>";
            Document document = null;
            SAXReader saxReader = new SAXReader();
            InputStream is = new ByteArrayInputStream(xml.getBytes());
            document = saxReader.read(is);
            Element result = document.getRootElement().element("Body").element("ProcessResponse").element("ProcessResult");
            String json = result.getText();
            System.out.println(json);

        } catch (Exception e) {
            System.out.print("异常:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

如果返回节点名称不一样,可以遍历整个xml,可以参考方法:

public static void parseXmlSax(String filename) throws Exception {
        Document document = null;
        SAXReader saxReader = new SAXReader();
        document = saxReader.read(new File(filename));
        Element root = document.getRootElement();
        System.out.println("根节点为:" + root.getName());
        Element elm = root.element("Body");
        List<?> bodyChild = elm.elements();
        for (Iterator<?> it = bodyChild.iterator(); it.hasNext();) {
            Element elm1 = (Element) it.next();
            System.out.println(elm1.getName());
            List<?> responseChild = elm1.elements();
            for (Iterator<?> it1 = responseChild.iterator(); it1.hasNext();) {
                Element elm2 = (Element) it1.next();
                System.out.println(elm2.getName() + " ===== " + elm2.getText());
            }

        }
    }

逐层遍历即可。

附:dom4j包下载地址:https://dom4j.github.io/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值