【问题标题】:Parsing complex response having an array inside another from SOAP in android从android中的SOAP解析具有另一个数组的复杂响应
【发布时间】:2017-12-11 16:40:36
【问题描述】:

我正在尝试使用 Ksoap2 从一个肥皂网络服务获取响应,但我得到的只是一个包含 xml 文件的字符串,有人知道我如何解析每个属性吗?

这是我正在使用的代码:

 SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapSerializationEnvelope soapEnvelope = new write(SoapEnvelope.VER11);
        soapEnvelope.dotNet = true;
        soapEnvelope.setOutputSoapObject(Request);

        transport = new HttpTransportSE(URL);
        transport.debug=true;

        transport.call(SOAP_ACTION, soapEnvelope);
        response = (SoapObject) soapEnvelope.bodyIn;

这是我得到的回应:

Response{
     Result= <raiz>
               <result>
                 <exitoso>val</exitoso>
                   <message>message</message>
               </result>
               <clients>
                 <client>
                   <id>id</id>
                   <name>name</name>
                   <lastname>lastname</lastname>
                 </client>
               </clients>
             </raiz>; 
}

有人知道我怎样才能得到实际数据吗?比如姓名、身份证和姓氏?

【问题讨论】:

  • 遍历你的响应,得到属性的属性值,你得到了什么? SOAP Object > getProperty
  • @veggirice 如果我尝试浏览响应,我只会得到“响应”属性,即&lt;raiz&gt; &lt;result&gt; &lt;exitoso&gt;val&lt;/exitoso&gt; &lt;message&gt;message&lt;/message&gt; &lt;/result&gt; &lt;clients&gt; &lt;client&gt; &lt;id&gt;id&lt;/id&gt; &lt;name&gt;name&lt;/name&gt; &lt;lastname&gt;lastname&lt;/lastname&gt; &lt;/client&gt; &lt;/clients&gt; &lt;/raiz&gt; 而且我的属性计数仅返回 1
  • 几个问题: 1. 您的响应变量的类型是什么?是肥皂对象吗? 2.如果是这样,那么当你做response.getProperty("name").toString()时,你得到了什么?
  • @veggirice 我 95% 确定它是一个 SoapObject,如果我尝试使用 response.getProperty("name").toString,我会收到下一个错误 illegal property: name
  • @veggirice 即使我可以制作一个返回 xml 数据的 response.getProperty("Result") :&lt;raiz&gt; &lt;result&gt; &lt;exitoso&gt;val&lt;/exitoso&gt; &lt;message&gt;message&lt;/message&gt; &lt;/result&gt; &lt;clients&gt; &lt;client&gt; &lt;id&gt;id&lt;/id&gt; &lt;name&gt;name&lt;/name&gt; &lt;lastname&gt;lastname&lt;/lastname&gt; &lt;/client&gt; &lt;/clients&gt;

标签: xml web-services android-studio soap android-ksoap2


【解决方案1】:

你可以试试这个:

SoapObject rootNode = response.getProperty("Result");
for (int i=0; i<= rootNode.getPropertyCount(); i++) {
   SoapObject so = rootNode.getProperty(i);
   String name = so.getProperty("name").toString();
   //print name to log/console
}

按照文档进行。您可能需要解决任何强制转换或依赖项。你从这个名字中得到什么?

【讨论】:

  • 如果您不能 100% 确定响应是 SoapObject 类型,那么只需将:SoapObject response = (SoapObject) soapEnvelope.bodyIn; 设置为上述 sn-p
  • @veggierice 我试过了,但出现以下错误:org.ksoap2.serialization.SoapPrimitive cannot be cast to org.ksoap2.serialization.SoapObject 显然我正在处理 SoapPrimitive 响应?
  • 您可能希望看到这个link,并且可能尝试使用 SoapObject 而不是 SoapPrimitive 作为您从信封中的响应
  • @veggierice 我正在使用 SoapObject 进行响应(我猜),比如这个 response = (SoapObject)soapEnvelope.getResponse();,对不起,我对 Soap 服务有点新,但这就是他们想要的在办公室使用,所以我必须进入它:/ 也感谢所有的帮助
  • np。然后它在某处抱怨肥皂原形
【解决方案2】:

好的,所以我花了太多时间,而且我没有找到其他真正适合我的方法,所以这就是我所做的。

首先,我调用 Web 服务,它返回一个带有 xml 文档的 CDATA 作为字符串,如下所示:

<![CDATA[<users>
     <user>
        <username>myusername</username>
        <password>myPassword</password>
     </user>
</users>]]>

收到回复后,我创建了一个用户类:

public class user
{
    public String userName, password;
}

我有一个类 get_values

public class get_values {

public static Document doc;
//--- Returns an ArrayList with the values of the User using the User Class
public static ArrayList<user> UserParser(SoapObject response)
        {
            XmlPullParserFactory parserFactory;
            try{
                parserFactory = XmlPullParserFactory.newInstance();
                XmlPullParser parser = parserFactory.newPullParser();
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                Source xmlSource = new DOMSource(GetDocFromString(response.getProperty(0).toString()));
                Result outputTarget = new StreamResult(outputStream);
                TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget);
                InputStream is = new ByteArrayInputStream(outputStream.toByteArray());
                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                parser.setInput(is, null);

                return UserProcessParser(parser);

            } catch (XmlPullParserException e) {

            } catch (IOException e) {
            } catch (TransformerConfigurationException e) {
            } catch (TransformerException e) {
                e.printStackTrace();
            }
            return null;
        }


        //--- Creates an xml document using the web service's response
        private static Document GetDocFromString(String xmlStr)
        {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder;
            try
            {
                builder = factory.newDocumentBuilder();
                doc = builder.parse( new InputSource( new StringReader( xmlStr ) ) );
                return doc;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        //--- Returns the xml values as an ArrayList
        private static ArrayList<user> UserProcessParser(XmlPullParser parser) throws XmlPullParserException, IOException
        {
            ArrayList<user> user_data = new ArrayList<>();
            int eventType = parser.getEventType();
            user_data user_returned = null;

            while (eventType != XmlPullParser.END_DOCUMENT){
                String elementName = null;
                switch (eventType){
                    case XmlPullParser.START_TAG:
                        elementName = parser.getName();
                        if ("user".equals(elementName))
                        {
                            user_returned = new user_data();
                            user_data.add(user_returned);
                        }
                        else if (user_returned != null)
                        {
                            if ("username".equals(elementName))
                            {
                                user_returned.username = parser.nextText();
                            }
                            else if ("password".equals(elementName))
                            {
                                user_returned.password = parser.nextText();
                            }
                        }
                        break;
                }
                eventType = parser.next();
            }

            return user;
        }

    }

然后我只是调用函数来获取包含所有值的数组列表:

ArrayList<user> user_data = get_values.UserParser(MY_WEBSERVICE_RESPONSE);

我得到了我需要的所有值,然后如果任何其他 Web 服务需要它,我添加另一个 Parser 函数和另一个进程解析器函数,然后如果它返回 null,你只需要检查响应。

这就是我最终得到的解决方案,我希望它可以帮助其他人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多