Android中用Ksoap获取标准webservice接口返回的复杂对象Dataset学习

本文介绍如何使用 Android 第三方插件 KSOAP2 解析从 WebService 接口返回的 Dataset 数据。提供了完整的 KSOAPHelper 类代码示例,演示了如何初始化、设置 SOAP 对象并获取解析后的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主题:Android项目中ksopa2访问标准webservice接口,若返回数据为一般字符串或者字符串数组则相对简单,网上大把,若是dataset,网上也有很多关于用Java把返回结果转为xml文件的,但觉得那样会多做很多工作,担心影响手机用户体验,研究了一下午,也不算难,只是解析麻烦点,见代码

一、返回的结果Dataset集,如图:




二、KsoapHelper网络请求类

Android常用第三方插件Ksoap2一般用法就不介绍了,可自行百度了解,下面是我的调试解析类,可解析成功运用到项目中去:

/**
 * @Title KsoapHelper.java
 * @Package com.intech.net.ksoap2
 * @Description TODO
 * @Author Don
 * @Date 2014-6-26 下午3:10:41
 * @Version V1.0
 */
package com.intech.net.ksoap2;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONObject;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpResponseException;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;

import com.intech.android.utils.FileUtil;
import com.intech.dinghuohui.model.Dealers;
/**
 * @author Administrator
 *
 */
public class KsoapHelper {

	
	/** 默认超时时间30S **/
	public static int timeOut = 30000 ;
	
	/** webservice 地址 **/
	public static String webServiceUrl;
	
	/** 命名空间 **/
	public static String nameSpace ;
	
	/** SOAP规范 **/
	public static int soapVersion = SoapEnvelope.VER12 ;
	
	private SoapObject soapObject ;
	
//	public
	
	private KsoapHelper(){
		
	}
	
	/** 初始化 **/
	public static void initKsoapHelper(String _webServiceUrl,String _nameSpace){
		initKsoapHelper(timeOut, _webServiceUrl,_nameSpace,soapVersion);
	}
	/** 初始化 **/
	public static void initKsoapHelper(String _webServiceUrl,String _nameSpace,int _version){
		initKsoapHelper(timeOut, _webServiceUrl,_nameSpace,_version);
	}
	
	/** 初始化 **/
	public static void initKsoapHelper(int _timeOut,String _webServiceUrl,String _nameSpace,int _version){
		nameSpace = _nameSpace;
		webServiceUrl = _webServiceUrl;
		timeOut = _timeOut;
		soapVersion = _version;
	}
	
	/**
	 * 设置SoapObject对象
	 * @param methodName 设置方法
	 * @return
	 */
	public static SoapObject GetSoapObject(String methodName){
		SoapObject object = new SoapObject(nameSpace,methodName);
		return object;
	}
	/**
	 * 设置SoapObject对象
	 * @param nameSpace 设置命名空间
	 * @param methodName 设置方法
	 * @return
	 */
	public static SoapObject GetSoapObject(String nameSpace,String methodName){
		SoapObject object = new SoapObject(nameSpace,methodName);
		return object;
	}
	
	/**
	 * Ksoap 访问webservice 返回简单类型结果
	 * @param object
	 * @return
	 * @throws HttpResponseException
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public static Object GetResult(String action,SoapObject object){
		// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
		SoapSerializationEnvelope sSEnvelope = new SoapSerializationEnvelope(soapVersion);
		sSEnvelope.bodyOut = object;
		sSEnvelope.dotNet=true;
		HttpTransportSE httpTransSE = new HttpTransportSE(webServiceUrl);
		//debug属性为true来打开调试信息
		httpTransSE.debug = true;
		SoapObject result = null;
		//方法HttpTransport.call()自己就能够发送请求给服务器、接收服务器响应并序列化SOAP消息,调用call方法是一个同步过程,需要等待它返回
		try {
			httpTransSE.call(null, sSEnvelope);
			result = (SoapObject) sSEnvelope.getResponse();
		} catch (HttpResponseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
//		// 另一种获取返回的数据方式  
		SoapObject result1 = (SoapObject) sSEnvelope.bodyIn; 
//		//打印输出调试信息
//		
		Log.e("getresponse==result", result.toString());
		Log.e("result.getPropertyCount()" , result.getPropertyCount()+"");
		Log.e("result.getProperty('diffgram')" , result.getProperty("diffgram").toString());
		Log.e("result.getProperty('diffgram').count" , ((SoapObject)result.getProperty("diffgram")).getPropertyCount()+"");
		Log.e("result.getProperty('diffgram').getProperty('NewDataSet')" , ((SoapObject)result.getProperty("diffgram")).getProperty("NewDataSet").toString());
		Log.e("result.getProperty('diffgram').getProperty('NewDataSet').count" , ((SoapObject)((SoapObject)result.getProperty("diffgram")).getProperty("NewDataSet")).getPropertyCount()+"");
		SoapObject dataset = (SoapObject) ((SoapObject)result.getProperty("diffgram")).getProperty("NewDataSet");
		List<Dealers> list = new ArrayList<Dealers>();
		for(int i=0;i<dataset.getPropertyCount();i++){
			SoapObject table = (SoapObject)dataset.getProperty(i);
			Log.e("table"+i, table.toString());
			Log.e("table"+i+" count", table.getPropertyCount()+"");
			String DealersCode = table.getPropertyAsString("DealersCode");
			String DealersName = table.getPropertyAsString("DealersName");
			float UpperLimit = (Float) table.getProperty("UpperLimit");
			float TheSale = (Float) table.getProperty("TheSale");
			String Sign ="";
			if(table.hasProperty("Sign")){
				Sign = (table.getPropertyAsString("Sign")==null?"": table.getPropertyAsString("Sign"));
			}
			Dealers deal = new Dealers();
			deal.setDealersName(DealersName);
			deal.setDealersCode(DealersCode);
			deal.setUpperLimit(UpperLimit);
			deal.setTheSale(TheSale);
			deal.setSign(Sign);
			list.add(deal);
			Log.e("list"+i, list.get(i).toString());
		}
		//测试获取的所有对象及其子对象,遍历到第三级
		for(int i=0;i<result.getPropertyCount();i++){
			Log.e(result.getName()+"["+i+"]", result.getProperty(i).toString());
			
			SoapObject object11 = (SoapObject) result.getProperty(i);
			
			Log.e("result 子元素 个数:object11.getPropertyCount()" , object11.getPropertyCount()+"");
			for(int ii=0;ii<object11.getPropertyCount();ii++){
				Log.e("result 子元素"+object11.getName()+"["+ii+"]", object11.getProperty(ii).toString());
				
				SoapObject object111 = (SoapObject) object11.getProperty(ii);
				Log.e("result 子元素  的子元素个数:object111.getPropertyCount()" , object111.getPropertyCount()+"");
				for(int iii=0;iii<object111.getPropertyCount();iii++){
					Log.e("result 子元素 的 子元素"+object111.getName()+"["+iii+"]", object111.getProperty(iii).toString());
					
					SoapObject object1111 = (SoapObject) object111.getProperty(iii);
					Log.e("result 子元素  的子元素的子元素个数:object1111.getPropertyCount()" , object1111.getPropertyCount()+"");
				}
			}
		}
		//打印一些测试结果
		Log.e("bodyin==result1", result1.toString());
		Log.e("result1.getPropertyCount()" , result1.getPropertyCount()+"");
		Log.e("result.getPropertyCount()>>" , result.getPropertyCount()+"");
		Log.e("result.getProperty('0')>>" , result.getProperty(0).toString());
		Log.e("result.getProperty('1')>>" , result.getProperty(1).toString());
		
		return result;
	}

}
三、上述接口改返回结果为Json字符串后处理

本想叫后端哥们修改结果,用简单http+json方式,我就用原有项目框架做起来更快,而不用再整合ksoap2进项目,也不需要解析复杂对象,那意味着他不要用标准webservice接口,而用简单VS中一般处理程序通过http协议在浏览器直接输出结果即可,没想到,他只是将结果json序列化返回给我。不敢再要求,只好,仍用ksoap,只是返回结果为json字符串,相当于string处理了,而不是复杂Dataset。修改上述KsoapHelper类中获取数据方法GetResult的返回结果,即直接返回获取到string字符串即可,之后将String转为json即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值