手把手教你SOAP访问webservice并DOM解析返回的XML数据

前言:

目前我们项目组还在采用webservice这种http方式,并且某些网站服务提供的对外接口还在采用webservice方式,因此就总结了一下写了这篇文章。

以soap1.2的请求为例,在例子里我们传进去用户名和密码给服务,服务返回一个xml数据。

首先我们来开一下soap1.2的request,

//wsdl,例:OrderApp.asmx
POST /******App.asmx HTTP/1.1
//这儿填写服务地址
Host: 100.100.100.100
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <Login xmlns="我的项目">
      <UserName>string</UserName>
      <PassWord>string</PassWord>
    </Login>
  </soap12:Body>
</soap12:Envelope>

接下来,我们在代码里拼接请求体:

/**
 * arg1为第一个参数键,arg2为第一个参数值,arg3为第二个参数键,arg4为第二个参数值,
 *method为方法名,xmlns为命名空间 */
    public void initSoap(String arg1,String arg2,String arg3,String arg4,String method,String xmlns) {
        String soapRequestData = "<?xml version=\"1.0\"       encoding=\"utf-8\"?>"
                + "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
                + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
                + " xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
                + " <soap12:Body>"
                + "<"+method+""+"xmlns="+"\""+xmlns+"\""
//                + " <Login xmlns=\"我的项目\">"
                + "<"+arg1+">"+arg2+"</"+arg1+">"
                + "<"+arg3+">"+arg4+"</"+arg3+">"
//                + " <UserName>"+"YQPIS0670"+"</UserName>"
//                + " <PassWord>"+"YQPIS0670"+"</PassWord>"
                + " </Login>"
                + "</soap12:Body>"
                + " </soap12:Envelope>";
    }

第二步,开启线程并执行访问

new Thread(new Runnable() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    PostMethod postMethod = new PostMethod(
    "服务地址,即上面request中的host+端口号+post");
    // 然后把Soap请求数据添加到PostMethod中
    byte[] b = null;
    try {
    b = soapRequestData.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
    InputStream is = new ByteArrayInputStream(b, 0, b.length);
    RequestEntity re = new InputStreamRequestEntity(is,
            b.length, "application/soap+xml; charset=utf-8");
    postMethod.setRequestEntity(re);
    // 最后生成一个HttpClient对象,并发出postMethod请求
    HttpClient httpClient = new HttpClient();
        try {
        int statusCode = httpClient.executeMethod(postMethod);
            if (statusCode == 200) {
                Log.d("soapRequestData", "调用成功!");
                StringBuffer buffer = new StringBuffer();
                // 解析器 工厂类
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                //返回流式数据
                InputStream soapResponseData = postMethod
                            .getResponseBodyAsStream();
                Document dm = db.parse(soapResponseData);
                // element和node是同一概念
                // 不同的是element提供更多方法
            if (dm.getElementsByTagName("Root").item(0)
                .getFirstChild() != null) {
                // j是Root即根节点下面节点个数
                for (int j = 0; j < dm  .getElementsByTagName("Root").item(0)
                           .getChildNodes().getLength(); j++) {
               String result3 = dm.getElementsByTagName("Root")                                 .item(0).getChildNodes().item(j).getTextContent();
                buffer.append(result3);
              }
            }
         } else {
        Log.d("soapRequestData", "调用失败!错误码:" + statusCode);
        }
    } catch (HttpException e) {
    // TODO Auto-generated catch block
            e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
            e.printStackTrace();
    } catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
            e.printStackTrace();
    } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }
  }
}).start();

大家可以看下我的xml数据:

<Root>
<Result>1</Result>
<Message>登录成功</Message>
<MemberIDCard>YQPIS0670</MemberIDCard>
<UserName>祁宏涛</UserName>
<Birthday>2010-11-04</Birthday>
<Photo>...</Photo>
<Telephone/>
<MemberState>当前会员</MemberState>
<MemberStatus>友情会籍</MemberStatus>
<MemberSex>12ee640d-a037-497e-966e-91fc2186c8b4</MemberSex>
<Nationality>175f0624-29d1-4b88-9d97-d72ebb1e6a1c</Nationality>
<MemberSexMemo>男</MemberSexMemo>
<NationalityMemo>中国</NationalityMemo>
</Root>

如果有多层节点,可以自己修改dm.getElementsByTagName(“Root”) .item(0).getChildNodes().item(j).getTextContent()

为dm.getElementsByTagName(“Root”) .item(0).getChildNodes().item(j).getChildNodes().item(k).getTextContent();即为3层节点的属性值。

好了,大家如果有不懂得就联系我哦;

时间: 2024-08-10 23:02:36

手把手教你SOAP访问webservice并DOM解析返回的XML数据的相关文章

手把手教你SOAP访问webservice并DOM解析返回的XML数据(转)

http://blog.csdn.net/u012534831/article/details/51357111 前言: 目前我们项目组还在采用webservice这种http方式,并且某些网站服务提供的对外接口还在采用webservice方式,因此就总结了一下写了这篇文章. 以soap1.2的请求为例,在例子里我们传进去用户名和密码给服务,服务返回一个xml数据. 首先我们来开一下soap1.2的request, //wsdl,例:OrderApp.asmx POST /******App.a

XML系列:(4)XML解析-JAXP的DOM解析方式读取XML

DOM.SAX和StAX只是解析方式,没有API. JAXP是SUN提供的一套XML解析API.    JAXP(Java API for XMLProcessing,意为XML处理的Java API) JAXP很好的支持DOM和SAX解析. JAXP开发包是JAVASE的一部分,它由java.xml.org.w3c.dom.org.xml.sax包及其子包组成 products.mxl <?xml version="1.0" encoding="UTF-8"

XML系列:(5)XML解析-JAXP的DOM解析方式修改XML

DOM.SAX和StAX只是解析方式,没有API. JAXP是SUN提供的一套XML解析API.JAXP(Java API for XMLProcessing,意为XML处理的Java API) JAXP很好的支持DOM和SAX解析. JAXP开发包是JAVASE的一部分,它由java.xml.org.w3c.dom.org.xml.sax包及其子包组成 1.以DOM解析方式修改XML 1.1.将Document树保存到文件中 package com.rk.xml.e_jaxp_dom_writ

WebService传递XML数据 C#DataSet操作XML 解析WebService返回的XML数据

Webservice传递的数据只能是序列化的数据,典型的就是xml数据.   /// <summary>         /// 通过用户名和密码 返回下行数据         /// </summary>         /// <param name="UserName">用户名</param>         /// <param name="UserPwd">密码</param>    

jQuery提交Json数据到Webservice,并接收返回的Json数据

jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; // 这里要直接使用JOSN对象 $.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: "/WebServices/ProductPropertyWebServi

XML系列:(6)XML解析-Dom4j的DOM解析方式读取XML

Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 animals.xml <?xml version="1.0" encoding="UTF-8"?> <Animals> <Cat id="c001" name="喵喵"> <Home>火星</Home> <

XML系列:(7)XML解析-Dom4j的DOM解析方式更新XML

Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 1.更新XML 1.1.写出内容到xml文档 package com.rk.xml.g_dom4j_write; import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.io.SAXReader; im

Java XML DOM解析(xPath)

(一) XML概念 在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.是Internet环境中跨平台的.依赖于内容的技术,也是当今处理分布式结构信息的有效工具.早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输. (二)XML作用 1.

SAX解析与DOM解析

SAX解析实例:http://www.iteye.com/topic/763895 Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode. 为了更好地解决大型 XML 处理的问题,Java 开发人员发明了 SAX.SAX 采用事件驱动的方式来处理 XML,它的处理方式是:为每一个元素.属性.内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程序提供.解析器以数据流的方式