2012-06-15 39 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