在Android中有更好的解析SoapObject的方法吗

在Android中有更好的解析SoapObject的方法吗,android,web-services,parsing,ksoap2,Android,Web Services,Parsing,Ksoap2,到目前为止,我已经成功地连接到Web服务并获得了SoapObject响应,但是我很难找到一种好的、干净的解析方法。搜索Internet并没有产生太多结果,每个人都有不同的方式和过程,通常针对自己的Web服务,使其成为一次性使用的解决方案。基本上,下面是我从Web服务得到的响应 anyType{ schema=anyType{ element=anyType{ complexType=anyType{ choice=anyType{ element=anyType{

到目前为止,我已经成功地连接到Web服务并获得了SoapObject响应,但是我很难找到一种好的、干净的解析方法。搜索Internet并没有产生太多结果,每个人都有不同的方式和过程,通常针对自己的Web服务,使其成为一次性使用的解决方案。基本上,下面是我从Web服务得到的响应

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
SoapObject response=(SoapObject)envelope.getResponse();
if(响应!=null){
Log.i(“消息”,“响应包含:”+response.toString());
SoapObject diffgram=(SoapObject)response.getProperty(“diffgram”);
SoapObject NewDataSet=(SoapObject)diffgram.getProperty(“NewDataSet”);
SoapObject RepInfo=(SoapObject)NewDataSet.getProperty(“Rep_x0020_信息”);
对于(int i=0;i

这个过程是有效的,因为在最后一个循环中,我得到了我想要的两个对象,但我只是觉得有一种更干净的方法可以做到这一点。我之所以问这个问题,是因为随着我深入这个应用程序,会有一些更复杂的Web服务调用,我希望能够在整个应用程序中实现可重用的功能,而不必构建服务器为每个请求添加所有SoapObjects只是为了深入了解我想要的对象。

有两种方法可以从web服务解析对象:
首先,假设您是web服务的所有者或创建者,您可以让web服务返回一个Json字符串,然后从客户端创建一个实体映射到Json,Json库将为您进行解析。

Second:web服务通常响应许多复杂对象,因此您可以创建实体以与这些对象进行映射。
您可以按照以下步骤了解如何映射简单对象,然后从转到我的答案,了解如何解析复杂对象。
就是这样的:

 HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVER_URL);
 androidHttpTransport.call(SOAP_ACTION, envelope);// call
 Entity entity = (Entity)envelope.bodyIn;
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);
通过在HttpTransportSE中设置debug属性,并在调用后立即获取requestDump和/或responseDump,您可以更轻松地获取响应(和请求)xml。类似如下:

 HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVER_URL);
 androidHttpTransport.call(SOAP_ACTION, envelope);// call
 Entity entity = (Entity)envelope.bodyIn;
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故障


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

我认为,您可以使用JSONObject,json非常简单。有关提示,我将研究Web服务是如何提供数据的,并查看是否可以让它返回json字符串。Web服务将被各种移动平台使用(现在它在iOS上,我在Android上工作,然后是Windows Phone)。你能帮我回答这个问题吗?