2012-10-16 148 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错误。

不要忘记在使用后禁用调试,因为它会降低性能,在这种情况下,这些转储属性将为空。

相关问题