安卓ksoap2獲取.net webservice後返回DateSet型的資料的解析方法
阿新 • • 發佈:2019-02-08
今天閒來沒事,一個朋友讓我幫忙看看他的專案,大概業務是這樣的:
手機客戶端呼叫.net的webservice後返回dataset型別的視訊列表資訊,解析資訊顯示在listview中,然後點選某個視訊可以下載到手機SD卡上
dateset型別的資訊:
anyType{schema=anyType{element=anyType{complexType=anyType{choice=anyType{element=anyType{complexType=anyType{sequence=anyType{element=anyType{}; element=anyType{}; element=anyType{}; }; }; }; }; }; }; }; diffgram=anyType{NewDataSet=anyType{Table=anyType{Course_CfName=格蘭仕的祕密01.flv; Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密01_200K.flv; cf_id=24267; }; Table=anyType{Course_CfName=格蘭仕的祕密02.flv; Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密02_200K.flv; cf_id=24268; }; Table=anyType{Course_CfName=格蘭仕的祕密03.flv; Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密03_200K.flv; cf_id=24269; }; Table=anyType{Course_CfName=格蘭仕的祕密04.flv; Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密04_200K.flv; cf_id=24270; }; Table=anyType{Course_CfName=格蘭仕的祕密05.flv; Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密05_200K.flv; cf_id=24271; }; Table=anyType{Course_CfName=走進蒙牛與牛根生面對面_01.flv; Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_01.flv; cf_id=24301; }; Table=anyType{Course_CfName=走進蒙牛與牛根生面對面_02.flv; Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_02.flv; cf_id=24302; }; }; }; }
相信呼叫webservice獲取伺服器資訊就不用給大家介紹了吧,一般沒有什麼難度,只要URL,NAMESPACE,METHOD和需要的引數正確,基本上都可以正常獲取到資訊,一般我們獲取到的都是xml型別的和json型別的,這種型別解析的方法很多,也很普遍,相信網上一查一大堆,但是像我們獲取到的這種dataset型別的資料,既不是xml,也不是json,那麼該怎麼去解析呢,下面就請看程式碼:
一、封裝視訊資訊的類
film.java
public class Film { /* * Course_CfName=格蘭仕的祕密01.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密01_200K.flv; * cf_id=24267; */ private String Course_CfName; private String Course_Updir; private String cf_id; public String getCourse_CfName() { return Course_CfName; } public void setCourse_CfName(String courseCfName) { Course_CfName = courseCfName; } public String getCourse_Updir() { return Course_Updir; } public void setCourse_Updir(String courseUpdir) { Course_Updir = courseUpdir; } public String getCf_id() { return cf_id; } public void setCf_id(String cfId) { cf_id = cfId; } }
GetVideoInfoService.java
二、從伺服器獲取資料並解析封裝(重點)
public class GetVideoInfoService { private static final String NAMESPACE ="http://????.org/"; // WebService地址 private static String URL ="http://????.????.????/androidphone/login.asmx?wsdl"; private static final String METHOD_NAME ="getVoides"; private static String SOAP_ACTION ="http://????.org/getVoides"; private List<Film> films=new ArrayList<Film>(); public List<Film> getVoidesInfo(String uname) { try { //(1) 指定webservice的名稱空間和呼叫的方法名 SoapObject rpc =new SoapObject(NAMESPACE, METHOD_NAME); //(2) 設定呼叫方法的引數值,如果沒有引數,可以省略, rpc.addProperty("userName", uname); //3 建立HttpTransportsSE物件。 AndroidHttpTransport ht =new AndroidHttpTransport(URL); ht.debug =true; //4 生成呼叫Webservice方法的SOAP請求資訊, //在建立SoapSerializationEnvelope物件後, //不要忘了設定SOAPSoapSerializationEnvelope類的bodyOut屬性, //該屬性的值就是在第一步建立的SoapObject物件 SoapSerializationEnvelope envelope =new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut = rpc; envelope.dotNet =true; envelope.setOutputSoapObject(rpc); //(5)使用call方法呼叫WebService方法 ht.call(SOAP_ACTION, envelope); //SoapObject result = (SoapObject) envelope.bodyIn; //Object detail=result.getProperty("getVoidesResult"); if (envelope.getResponse() != null) { SoapObject soapObject = (SoapObject) envelope.bodyIn; SoapObject soap1 = (SoapObject) soapObject.getProperty("getVoidesResult"); /** * 此時的獲取到的資訊是: * anyType{schema=anyType{element=anyType{complexType=anyType{choice=anyType * {element=anyType{complexType=anyType{sequence=anyType{element=anyType{}; * element=anyType{}; element=anyType{}; }; }; }; }; }; }; }; * diffgram=anyType{NewDataSet=anyType{ * Table=anyType{ * Course_CfName=格蘭仕的祕密01.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密01_200K.flv; * cf_id=24267; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密02.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密02_200K.flv; * cf_id=24268; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密03.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密03_200K.flv; * cf_id=24269; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密04.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密04_200K.flv; * cf_id=24270; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密05.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密05_200K.flv; * cf_id=24271; }; * Table=anyType{ * Course_CfName=走進蒙牛與牛根生面對面_01.flv; * Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_01.flv; * cf_id=24301; }; * Table=anyType{ * Course_CfName=走進蒙牛與牛根生面對面_02.flv; * Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_02.flv; * cf_id=24302; }; }; }; } */ SoapObject soapChilds =(SoapObject)soap1.getProperty(1); /**因為0位置對我們來說沒有資料,所以我們去1位置的資訊 * anyType{NewDataSet=anyType{ * Table=anyType{ * Course_CfName=格蘭仕的祕密01.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密01_200K.flv; * cf_id=24267; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密02.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密02_200K.flv; * cf_id=24268; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密03.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密03_200K.flv; * cf_id=24269; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密04.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密04_200K.flv; * cf_id=24270; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密05.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密05_200K.flv; * cf_id=24271; }; * Table=anyType{ * Course_CfName=走進蒙牛與牛根生面對面_01.flv; * Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_01.flv; * cf_id=24301; }; * Table=anyType{ * Course_CfName=走進蒙牛與牛根生面對面_02.flv; * Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_02.flv; * cf_id=24302; }; }; }; } */ SoapObject soap2=(SoapObject)soapChilds.getProperty(0); /**去掉了前面的部分anyType{NewDataSet= * anyType{ * Table=anyType{ * Course_CfName=格蘭仕的祕密01.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密01_200K.flv; * cf_id=24267; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密02.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密02_200K.flv; * cf_id=24268; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密03.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密03_200K.flv; * cf_id=24269; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密04.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密04_200K.flv; * cf_id=24270; }; * Table=anyType{ * Course_CfName=格蘭仕的祕密05.flv; * Course_Updir=webupload/整理課件/2012年5月/格蘭仕的祕密\200K\格蘭仕的祕密05_200K.flv; * cf_id=24271; }; * Table=anyType{ * Course_CfName=走進蒙牛與牛根生面對面_01.flv; * Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_01.flv; * cf_id=24301; }; * Table=anyType{ * Course_CfName=走進蒙牛與牛根生面對面_02.flv; * Course_Updir=webupload/整理課件/2012年5月/走進蒙牛 與牛根生面對面\200K\走進蒙牛與牛根生面對面_02.flv; * cf_id=24302; }; }; }; } */ if(films.size()>0){ films.clear(); } /** * 裡面有7個視訊,所以需要我們遍歷取出 */ for(int i=0;i<soap2.getPropertyCount();i++){ SoapObject soap3=(SoapObject) soap2.getProperty(i);//取出每個視訊資訊 Film film=new Film(); film.setCourse_CfName(soap3.getProperty("Course_CfName").toString()); film.setCourse_Updir("????.????.com/"+soap3.getProperty("Course_Updir").toString()); film.setCf_id(soap3.getProperty("cf_id").toString()); films.add(film);//封裝後存入集合中 } } } catch (Exception e) { e.printStackTrace(); } return films; }
三,新建個activity,呼叫webservice中的方法並遍歷顯示
GetVideoInfoService videoService=new GetVideoInfoService();
List<Film> list=videoService.getVoidesInfo("test");
for(Film film:list){
System.out.println("視訊名稱:"+film.getCourse_CfName());
System.out.println("視訊路徑:"+film.getCourse_Updir());
System.out.println("視訊編號:"+film.getCf_id());
System.out.println("==============================================");
}
執行結果:
轉載請註明出處