2012-06-15 81 views
0

我正在做一個應用程序,正在從Web服務(實施肥皂)請求數據。期待嵌套的XML結構,但接收SOAP結構

查看此問題的用戶在評論中發佈疑惑...我還沒有對問題做出任何迴應請問我是否有任何疑問,我真的需要幫助,我卡住了!

因此,爲了提出請求,我必須使用kso​​ap庫.. Web服務是編碼返回類型XML的響應。當Web服務本身是在瀏覽器上測試它顯示其結果如下:

?xml version="1.0" encoding="utf-8" ?> 
- <SOBKeyList> 
- <Key> 
    <value>12686</value> 
    </Key> 
- <Key> 
    <value>16238</value> 
    </Key> 
- <Key> 
    <value>26978</value> 
    </Key> 
    </SOBKeyList> 

顯然是XML文件 ...

However當我使用的部份代碼,得到的結果:

public String getXmlFromUrl(String url) { 
    // TODO Auto-generated method stub 
    String xml = null; 
    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME); 
    PropertyInfo pi = new PropertyInfo(); 

    pi.setName("fkey"); 
    pi.setValue(0); 
    pi.setType(Integer.class); 
    request.addProperty(pi); 

    pi = new PropertyInfo(); 

    pi.setName("tkey"); 
    pi.setValue(999999); 
    pi.setType(Integer.class); 
    request.addProperty(pi); 


    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
      SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    HttpTransportSE httpTransport = new HttpTransportSE(url); 
    Object response = null; 

    try { 
     httpTransport.call(SOAP_ACTION, envelope); 
     response = envelope.getResponse(); 
     xml = response.toString(); 
     Log.d("xml:", xml); 
    } catch (SoapFault e) { 
     // TODO Auto-generated catch block 
     Log.d("Soap Fault", e.toString()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     Log.d("IOexception", e.toString()); 
    } catch (XmlPullParserException e) { 
     // TODO Auto-generated catch block 
     Log.d("XmlPullParserException", e.toString()); 
    } 

    return xml; 
} 

它通過在日誌條目我使返回嵌套SOAP結構確認Log.d("xml:", xml);) 相應logcat的條目是:(我格式化它,使其成爲SOAP結構的層次結構明顯...)

anyType{ 
     SOBKeyList=anyType{ 
          Key=anyType{value=12686 ; }; 
          Key=anyType{value=16238 ; }; 
          Key=anyType{value=26978 ; }; 
         }; 
      } 

我爲什麼一定需要一個XML的原因是因爲以後我解析字符串得到DOM元件和當上述字符串傳遞它返回下列信息:

org.xml.sax.SAXParseException:意外令牌(位置:TEXT anyType的{SOBKeyLi ... @ 1:119的java.io .StringReader @ 40ec9c68)

也從那裏開始我的整個代碼取決於響應是XML的事實。

爲什麼我預期的XML的原因闡釋: 現在你可能會問,爲什麼我編寫我的應用程序期待XML時,我沒有測試Web服務的原因是:Web服務進行編碼我的第三方誰向我保證了一個XML響應,現在我沒有足夠的時間來改變我的剩餘代碼來利用SOAP結構! -_- 我正在修復。請幫忙!

回答

1

試試這個:

String responseXML = httpTransport.responseDump; 
  • HttpTransportSE.responseDump爲您提供了XML格式的響應。
  • HttpTransportSE.requestDump爲您提供XML格式的請求。

然而,爲了能夠改變和檢索的任何值,你必須設置的HttpTransportSEtruedebug字段,以便您的代碼看起來應該像...

HttpTransportSE httpTransport = new HttpTransportSE(url); 
    httpTransport.debug =true;  
    try { 
     httpTransport.call(SOAP_ACTION, envelope);   
     xml = httpTransport.responseDump; 
     Log.d("xml:", "is:" + xml);  
    } 

你也可以像解析如下你的迴應:

ArrayList<String> listValues = new ArrayList<String>(); 

      httpTransport.call(SOAP_ACTION, envelope); 
      SoapObject response = (SoapObject) envelope.getResponse(); 

      SoapObject soapSOBKeyList = (SoapObject) response.getProperty("SOBKeyList"); 

      int keyCount = soapSOBKeyList.getPropertyCount(); 

      for (int i = 0; i < keyCount; i++) { 
       String value = soapSOBKeyList.getPropertyAsString(i); 
       listValues.add(value); 
      } 

      return listValues; 
+0

我才意識到我已經貼了一些錯誤的代碼(我的問題,編輯以及): 'HttpTransportSE httpTransport = new HttpTransportSE(url); 對象響應= null; try { httpTransport.call(SOAP_ACTION,envelope); response = envelope.getResponse(); xml = response.toString(); Log.d(「xml:」,xml); }' – Shark

+0

我已經在使用HttpTransportSE ...我應該在哪裏放行'httpTransport.responseDump'? – Shark

+0

'httpTransport.call(SOAP_ACTION,envelope);' 'xml = androidHttpTransport.responseDump;' – OguzOzkeroglu