2010-06-22 8 views
5

Używam biblioteki ksoap2 do komunikowania się z klientem Android z usługą sieciową SOAP. Świetna robota została wykonana przez zespół ksoap, ale problem polega na tym, że nie ma żadnego dobrego przykładu, jak używać go poprawnie w różnych aspektach. Na przykład mam w odpowiedzi mydła następujące dane:Parsowanie Odpowiedź 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; }; 
    ... 
} 

To złożony obiekt, a raczej zbiorem obiektów StatusSetting. Kiedy próbuję uzyskać właściwość SoapObject, jest to tylko 1 właściwość z wszystkimi danymi jako ciągiem znaków. Nie można go również analizować jako json. Niewiarygodne, że nikt nie spotkał się z tym samym problemem związanym z popularnością Androida, który zyskuje. Byłoby bardzo fajnie wiedzieć, czy ktoś rozwiązał ten problem i jak. Dzięki.

Odpowiedz

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); 
    } 
} 

nadzieję powinno działać

+0

w powyższym przypadku załóżmy, że CountryName = "" następnie analizujemy jej wartość jako anyType .. ie. String countryName = anyType .. Jakieś rozwiązanie tego? –

8

Na przykład Twoja odpowiedź:

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; 
     }; 
    }; 
} 

wnioskowania i analizowania zrobić tak:

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

w powyższym przykładzie załóżmy, że CountryName = "" następnie analizujemy jej wartość jako anyType .. ie. String countryName = anyType .. Jakieś rozwiązanie tego? –

+0

Wspaniały przykład. – neteinstein

+0

@Rooban Ponraj Bardzo ładny przykład, ale z tym kodem dostaje tylko pierwszy zestaw odpowiedzi jak tylko otrzymywanie ** Książki ** dane odpowiedzi za każdym razem, ale nie otrzymując ** Kamery ** odpowiedź danych ... Czy ktoś może mi pomóc. Dziękujemy –

0

My Projekt to działa. Mam nadzieję, że to się dzieje.

 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

Format JSON jest bardzo wygodny. Napisałem prosty kod do konwersji SOAP odpowiedzi V1 do JSON:

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; 
} 

i stosować tę funkcję jako:

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

Należy pamiętać, że nie używam env.bodyIn SoapObject.

Może to nie być idealny konwerter dla wszystkich odpowiedzi, więc zmodyfikuj 'String.replace' i Pattern-Matchers zgodnie z wymaganiami.

+0

Jeśli to pytanie jest duplikatem tego linku, zamknij je jako duplikat zamiast pozostawić odpowiedź na ten temat. Jeśli nie jest duplikatem, zostaw pełną odpowiedź zamiast odpowiedzi związanej z linkiem. – josliber