我正在尝试使用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和姓氏?
答案 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,你只需要检查响应。
那就是我最终解决的问题,我希望它可以帮助其他任何人