解析复杂的响应,在android中的SOAP中有另一个数组

时间:2017-12-11 16:40:37

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

我正在尝试使用Ksoap2从soap webservice获取响应,但我得到的是一个包含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>; 
}

任何人都知道如何获取实际数据?比如名字,ID和姓氏?

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

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
}

通过文档。您可能需要解决任何转换或依赖关系。你得到的名字是什么?

答案 1 :(得分:0)

好的,所以我花了太多时间而且我找不到另一种对我有用的方法,所以这就是我所做的。

首先,我调用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:

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

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

那就是我最终解决的问题,我希望它可以帮助其他任何人