手把手教你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.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, , 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 == ) {
                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()
                .getFirstChild() != null) {
                // j是Root即根节点下面节点个数
                for (int j = ; j < dm  .getElementsByTagName("Root").item()
                           .getChildNodes().getLength(); j++) {
               String result3 = dm.getElementsByTagName("Root")                                 .item().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层节点的属性值。
手把手教你SOAP访问webservice并DOM解析返回的XML数据(转)的更多相关文章
- WebService传递XML数据 C#DataSet操作XML 解析WebService返回的XML数据
		Webservice传递的数据只能是序列化的数据,典型的就是xml数据. /// <summary> /// 通过用户名和密码 返回下行数据 /// & ... 
- 使用dom解析器对xml文档内容进行增删查改
		直接添代码: XML文档名称(one.xml) <?xml version="1.0" encoding="UTF-8" standalone=" ... 
- jQuery提交Json数据到Webservice,并接收返回的Json数据
		jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; ... 
- DOM解析,取得XML文件里面的信息
		1 创建解析器工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 2 解析器工厂对象创建解析器对象 Do ... 
- VB调用WebService(SOA2.0接口)(直接Post方式)并解析返回的XML
		SOA 2.0接口 Function GetDepartmentCode(reqDeptCode) Dim soaRequestXML : soaRequestXML = "" D ... 
- XML解析-Dom4j的DOM解析方式更新XML
		Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 1.更新XML 1.1.写出内容到xml文 ... 
- Java DOM解析器 - 修改XML文档
		这是我们需要修改的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8&q ... 
- Java DOM解析器 - 查询XML文档
		这是需要我们查询的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0"?> ... 
- Android使用webService(发送xml数据的方式,不使用jar包)
		Android使用webService可以用ksoap2.jar包来使用.但是我觉得代码不好理解,而且记不住. 所以我查询了好多资料,以及自己的理解.可以用代码发送http请求(发送xml数据)来访问 ... 
随机推荐
- 【洛谷P3413】萌数
			题目大意:求区间 [l,r] 内萌数的个数,其中萌数定义为数位中存在长度至少为 2 的回文子串的数字. 题解:l, r 都是 1000 位级别的数字,显然是一道数位 dp 的题目,暴力直接去世. 发现 ... 
- 微信小程序中的自定义组件(components)
			其实小程序开发很像vue和react的结合,数据绑定和setData 重新渲染页面的数据,最近发现连写组件都是很像,也是醉了,自我认为哈, 因为小程序可以将页面内的功能模块抽象成自定义组件,以便在 ... 
- Tomcat网站上的core和deployer的区别
			8.5.13 Please see the README file for packaging information. It explains what every distribution(分布) ... 
- 【NOIP2016提高A组模拟9.9】爬山
			题目 国家一级爬山运动员h10今天获得了一张有着密密麻麻标记的地图,在好奇心的驱使下,他又踏上了去爬山的路. 对于爬山,h10有一个原则,那就是不走回头路,于是他把地图上的所有边都标记成了有向边.他决 ... 
- python4---打印长方形
			1:方法1for i in range(6): for j in range(3): print("*", end=" ") print() 2:输入显示长方形 ... 
- TCP三次握手摘要
			这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足& ... 
- ideal 工具jdk环境配置
			1.File >> Other Settings >> Default Project Structure ... 2.Project >> jdk_vie ... 
- css使用2
			一.盒子模型 盒子模型 margin:用来调节盒子与盒子之间的距离(标签与标签之间距离) border:盒子的包装厚度(边框) padding:内部物体与盒子之间距离(文本与边框之间的距离) cont ... 
- 使用WebStorm运行vue项目
			在WebStorm中怎么打开一个已有的项目,这个不用多说,那么如何运行一个vue项目呢? 1.点击下图中右上角的红框. 2.在出现的弹框中选中左上角“+”下的“npm”,如下图所示. 3.选中第二步的 ... 
- React曾经忽略的知识点(下)
			1.JSX渲染 想让类似 false.true.null 或 undefined 出现在输出中,你必须先把它转换成字符串 : <div> My JavaScript variable is ... 
