到目前为止,我已经设法连接到Web服务并获得我的SoapObject响应,但是我在缩小一种良好,干净的解析方式时遇到了麻烦。搜索互联网并没有真正产生太多结果,每个人都有不同的方式,不同的过程通常面向他们自己的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
这个过程是有效的,因为在最后一个循环中,我得到了我想要的两个对象,但我觉得这样做有一个更简洁的方法。我只是问,因为随着我进一步进入这个应用程序,将会有一些更复杂的Web服务调用,我希望能够在整个应用程序中拥有可重用的东西,而不必为每个请求构建几个SoapObject到我想要的对象。
答案 0 :(得分: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;
答案 1 :(得分:0)
您可以通过在HttpTransportSE中设置debug属性,并在调用后立即获取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块中也可以使用它来分析肥皂故障。
不要忘记在使用后禁用调试,因为它会降低性能,在这种情况下,这些转储属性将为null。