2010-06-22 16 views
5

मैं एसओएपी वेब सेवा के साथ एंड्रॉइड क्लाइंट से संचार करने के लिए ksoap2 lib का उपयोग करता हूं। कसप टीम द्वारा महान काम किया गया था, लेकिन समस्या यह है कि, कोई भी अच्छा उदाहरण नहीं है कि इसे विभिन्न पहलुओं में सही तरीके से कैसे उपयोग किया जाए। उदाहरण के लिए मैं डेटा निम्नलिखित साबुन जवाब में मिलती है:पार्सिंग ksoap2 प्रतिक्रिया

anyType{ 
    StatusSetting=anyType{Id=1; Name=Til afskrivning; LocationId=1; Editable=true; Default=true; Transcribed=false; }; 
    StatusSetting=anyType{Id=2; Name=Afskrevet; LocationId=1; Editable=false; Default=false; Transcribed=true; }; 
    ... 
} 

यह एक जटिल वस्तु, या बल्कि StatusSetting वस्तुओं का संग्रह है। जब मैं सोपऑब्जेक्ट की संपत्ति प्राप्त करने का प्रयास करता हूं तो यह स्ट्रिंग के रूप में सभी डेटा के साथ केवल 1 संपत्ति है। इसे जेसन के रूप में भी पार्स नहीं किया जा सकता है। अविश्वसनीय है कि कोई भी लोकप्रियता एंड्रॉइड के संबंध में एक ही समस्या से मुलाकात नहीं कर रहा है। यह जानने के लिए बहुत अच्छा होगा कि किसी ने इस मुद्दे को हल किया है और कैसे। धन्यवाद।

उत्तर

4
SoapObject countryDetails = (SoapObject)envelope.getResponse(); 
System.out.println(countryDetails.toString()); 

ArrayList list = new ArrayList(countryDetails.getPropertyCount()); 
lv_arr = new String[countryDetails.getPropertyCount()]; 
for (int i = 0; i < countryDetails.getPropertyCount(); i++) { 
    Object property = countryDetails.getProperty(i); 
    if (property instanceof SoapObject) { 
     SoapObject countryObj = (SoapObject) property; 
     String countryName = countryObj.getProperty("countryName").toString(); 
     list.add(countryName); 
    } 
} 

आशा है कि यह

+0

उपर्युक्त मामले में देश नाम = "" मान लीजिए तो यह किसी भी प्रकार के रूप में इसके मान को पार्स .. यानी। स्ट्रिंग देशनाम = किसी भी प्रकार .. इसके लिए कोई समाधान? उपरोक्त मामले में –

8

उदाहरण के लिए अपने रिस्पांस काम करना चाहिए:

anyType 
{ 
    FOO_DEALS=anyType 
    { 
     CATEGORY_LIST=anyType 
     { 
     CATEGORY=Books; 
     CATEGORY_URL=books_chennai; 
     CATEGORY_ICON=http://deals.foo.com/common/images/books.png; 
     CATEGORY_COUNT=1045; 
     TYPE=1; 
     SUPERTAG=Books; 
     }; 
     CATEGORY_LIST=anyType 
     { 
      CATEGORY=Cameras; 
      CATEGORY_URL=cameras_chennai; 
      CATEGORY_ICON=http://deals.foo.com/common/images/cameras.png; 
      CATEGORY_COUNT=152; 
      SUPERTAG=Cameras; 
      TYPE=1; 
     }; 
    }; 
} 

का अनुरोध और पार्स करने के लिए इस तरह कार्य करें:

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      // Add the input required by web service 
      request.addProperty("city","chennai"); 
      request.addProperty("key","10000"); 

      SoapSerializationEnvelope envelope =new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.setOutputSoapObject(request); 

      // Make the soap call. 
      androidHttpTransport.call(SOAP_ACTION, envelope); 

      // Get the SoapResult from the envelope body. 
      resultRequestSOAP = (SoapObject) envelope.bodyIn; 


      System.out.println("********Response : "+resultRequestSOAP.toString()); 

      SoapObject root = (SoapObject) resultRequestSOAP.getProperty(0); 
      SoapObject s_deals = (SoapObject) root.getProperty("FOO_DEALS"); 

      StringBuilder stringBuilder = new StringBuilder(); 

      System.out.println("********Count : "+ s_deals.getPropertyCount()); 

      for (int i = 0; i < s_deals.getPropertyCount(); i++) 
      { 
       Object property = s_deals.getProperty(i); 
       if (property instanceof SoapObject) 
       { 
        SoapObject category_list = (SoapObject) property; 
        String CATEGORY = category_list.getProperty("CATEGORY").toString(); 
        String CATEGORY_URL = category_list.getProperty("CATEGORY_URL").toString(); 
        String CATEGORY_ICON = category_list.getProperty("CATEGORY_ICON").toString(); 
        String CATEGORY_COUNT = category_list.getProperty("CATEGORY_COUNT").toString(); 
        String SUPERTAG = category_list.getProperty("SUPERTAG").toString(); 
        String TYPE = category_list.getProperty("TYPE").toString(); 
        stringBuilder.append 
        (
         "Row value of: " +(i+1)+"\n"+ 
         "Category: "+CATEGORY+"\n"+ 
         "Category URL: "+CATEGORY_URL+"\n"+ 
         "Category_Icon: "+CATEGORY_ICON+"\n"+ 
         "Category_Count: "+CATEGORY_COUNT+"\n"+ 
         "SuperTag: "+SUPERTAG+"\n"+ 
         "Type: "+TYPE+"\n"+ 
         "******************************" 
        );     
        stringBuilder.append("\n"); 
       } 
      } 
+0

मान लीजिए देशनाम = "" तो यह किसी भी प्रकार के रूप में इसके मान को पार्स करता है .. यानी। स्ट्रिंग देशनाम = किसी भी प्रकार .. इसके लिए कोई समाधान? –

+0

बहुत बढ़िया उदाहरण। – neteinstein

+0

@Rooban Ponraj एक बहुत अच्छा उदाहरण है, लेकिन इस कोड के साथ केवल प्रतिक्रियाओं का पहला सेट प्राप्त हो रहा है जैसे कि ** केवल ** पुस्तकें ** डेटा प्रतिक्रिया प्राप्त करना, लेकिन ** कैमरा ** डेटा प्रतिक्रिया नहीं मिल रहा है ... क्या कोई मेरी मदद कर सकता है। धन्यवाद –

0

मेरे परियोजना यह काम है। आशा है कि इस हेप्लस।

 SoapObject requestx = new SoapObject(NAMESPACE, METHOD_NAME); 

     SoapSerializationEnvelope envelopex = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelopex.dotNet = true; 
     envelopex.setOutputSoapObject(requestx); 
     HttpTransportSE httpTransportx = new HttpTransportSE(URL);   

     try {      
      httpTransportx.call(SOAP_ACTION, envelopex); 
      SoapObject responsex = (SoapObject)envelopex.getResponse(); // not envelopex.bodyIn; 

      int i=0; 
      int RCount=responsex.getPropertyCount(); 
      int[] tbIDArray = new int[RCount+1]; 
      int[] iMonthAarray = new int[RCount+1]; 
      int[] iYearAarray = new int[RCount+1]; 
      String[] sDetailAarray = new String[RCount+1]; 

      for (i = 0; i < RCount; i++) { 
       Object property = responsex.getProperty(i); 
       if (property instanceof SoapObject) { 
        SoapObject info = (SoapObject) property; 
        String tbID = info.getProperty("tbID").toString(); 
        String iMonth = info.getProperty("iMonth").toString(); 
        String iYear = info.getProperty("iYear").toString(); 
        String sDetail = info.getProperty("sDetail").toString(); 

        tbIDArray[i] =Integer.valueOf(tbID); 
        iMonthAarray[i] =Integer.valueOf(iMonth); 
        iYearAarray[i] =Integer.valueOf(iYear); 
        sDetailAarray[i] =sDetail; 
       }//if (property instanceof SoapObject) { 
      }//for (i = 0; i < RCount; i++) { 


     } catch (Exception exception) { 
      MsgBox1(exception.toString() , "Error"); 
     } 
0

JSON प्रारूप बहुत आरामदायक है। मैं JSON करने के लिए सोप V1 प्रतिक्रिया कन्वर्ट करने के लिए एक सरल कोड लिखा है:

public static String soapStrToJson(String input) 
{ 
    String output; 

    output = input; 
    output = output.replace("key=", "\""); 
    output = output.replace("; value=", "\":"); 
    output = output.replace("; };",","); 
    output = output.replace("item=anyType{",""); 
    output = output.replace("Map",""); 
    output = output.replace(",}","}"); 
    output = output.replace(", }"," }"); 
    output = output.replace("null","0"); 

    Pattern pattern = Pattern.compile(":(.*?),"); 
    Matcher matcher = pattern.matcher(output); 

    List<String> wordsToReplace = new ArrayList(); 
    while (matcher.find()) 
    { 
     String str = matcher.group(0); 
     if(str.contains("{") || str.contains("[")) 
      continue; 

     str = str.replace(":", ""); 
     str = str.replace(",", ""); 

     if(str.matches("^-?\\d+$")) 
      continue; 

     System.out.println("-->" + str); 
     wordsToReplace.add(str); 
    } 

    for(String str : wordsToReplace) 
    { 
     output = output.replace(":"+str+",", ":\""+str+"\","); 
    } 
    return output; 
} 

और के रूप में इस समारोह का प्रयोग किया:

parseCategoryJSON(new JSONObject(soapStrToJson(env.getResponse().toString()))) 

ध्यान दें कि मैं उपयोग नहीं कर रहा env.bodyIn SoapObject।

यह सभी प्रतिक्रियाओं के लिए सही कनवर्टर नहीं हो सकता है, इसलिए अपनी आवश्यकता के अनुसार 'स्ट्रिंग.रेप्लेस' और पैटर्न-मैचर्स को संशोधित करें।

+0

यदि यह प्रश्न लिंक किए गए प्रश्न का डुप्लिकेट है, तो कृपया उस प्रभाव का उत्तर छोड़ने के बजाय इसे डुप्लिकेट के रूप में बंद करें। यदि यह डुप्लिकेट नहीं है, तो कृपया लिंक-केवल उत्तर के बजाय एक पूर्ण उत्तर छोड़ दें। – josliber