2012-10-16 74 views
1

到目前爲止,我已經設法連接到一個Web服務並獲得我的SoapObject響應,但是我無法縮小一個很好的,乾淨的解析方式。搜索互聯網並沒有真正產生太多的結果,每個人都有不同的方式和不同的流程,通常針對他們自己的Web服務,使其成爲一次性使用類型的解決方案。基本上,下面是我從一個Web服務有沒有更好的解析Android中的SoapObject的方法

anyType{ 
schema=anyType{ 
    element=anyType{ 
    complexType=anyType{ 
    choice=anyType{ 
    element=anyType{ 
     complexType=anyType{ 
     sequence=anyType{ 
     element=anyType{}; 
      element=anyType{}; 
      element=anyType{}; 
       element=anyType{}; }; }; }; }; }; }; }; 
     diffgram=anyType{ 
     NewDataSet=anyType{ 
      Rep_x0020_Information=anyType{ 
      Login=CorrectLogin; Password=InCorrectPass; }; }; }; } 

,基本上我希望能夠解析出剛剛在兩個重要領域(登錄名和密碼)獲得響應。從我閱讀的內容來看,我試着迭代基於屬性計數的SoapObject響應,但似乎並不奏效。當我想我得到的2財產計數響應所以不是我最後做一些這樣的事如下:

SoapObject response=(SoapObject) envelope.getResponse(); 

       if (response != null) { 
        Log.i("Message", "the response contains: " + response.toString()); 
        SoapObject diffgram = (SoapObject) response.getProperty("diffgram"); 
        SoapObject NewDataSet = (SoapObject) diffgram.getProperty("NewDataSet"); 
        SoapObject RepInfo = (SoapObject) NewDataSet.getProperty("Rep_x0020_Information"); 
        for (int i = 0; i < RepInfo.getPropertyCount(); i++) { 
         PropertyInfo info = new PropertyInfo(); 
         RepInfo.getPropertyInfo(i, info); 
         Log.d("Info", info.name + " : " + RepInfo.getProperty(i).toString()); 
        } 


//which gives the following message in LogCat 
    D/Info(716): Login : InCorrectLogin 
    D/Info(716): Password : InCorrectPass 

這個過程的作品,由最後一個循環,我得到了兩個對象我想,但我只是覺得有一個更乾淨的方式來做到這一點。我只問,因爲當我進一步進入這個應用程序時,會有一些更復雜的Web服務調用被創建,我希望能夠在整個應用程序中擁有可重用的內容,而不必爲每個請求構建多個SoapObjects直到我想要的物體。

+0

我想,你可以使用JSONObject,json對解析非常簡單 – Jamshid

回答

2

有2種方式,從Web服務解析對象:
首先,假設你是一個Web服務的所有者或創建者,可以使Web服務返回一個JSON字符串,然後從客戶端,您可以創建一個實體映射到Json,並且Json庫將爲您解析。

第二:web服務通常會響應很多複雜的對象,所以您可以使實體與這些對象進行映射。
你可以按照this tutorial瞭解如何映射一個簡單的對象,然後從我的回答this question知道解析複雜的對象。
這只是這樣的事情:

HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVER_URL); 
androidHttpTransport.call(SOAP_ACTION, envelope);// call 
Entity entity = (Entity)envelope.bodyIn; 
+0

感謝您的提示,我將研究Web Service如何提供數據並查看是否可以讓它返回JSON字符串。 WEb服務將被各種移動平臺使用(現在它在iOS上,我正在使用Android,然後是Windows Phone)。 –

+0

你能幫助回答這個問題嗎? http://stackoverflow.com/questions/26903238/how-to-parse-soap-response-when-child-tags-have-different-name-and-no-of-tag-are – 2014-11-13 07:27:16

0

您可以通過電話後立即設置調試財產HttpTransportSE,並獲得requestDump和/或responseDump得到一個更簡單的方法響應(和要求)XML。這樣的事情:

HttpTransportSE httpTransport = new HttpTransportSE(wsURL); 
httpTransport.debug = true; 

httpTransport.call("WS_NAMESPACE" + methodName, envelope); 

Log.w("RawXML Request:" + httpTransport.requestDump); 
Log.w("RawXML Response:" + httpTransport.responseDump); 

你甚至可以在try catch塊中使用它來分析soap錯誤。

不要忘記在使用後禁用調試,因爲它會降低性能,在這種情況下,這些轉儲屬性將爲空。

相關問題