Android Don';t使用ksoap2从SOAP Web服务接收嵌套的XML节点
大家好, 我对这个问题越来越糊涂了。我希望有人能帮助我!! 我在网上搜索了一个解决方案,但我发现的每件事都不适合我。这是一个场景: 我正在尝试向.net ws发出请求。请求很简单,但响应是嵌套的2级XML结构,如下所示:Android Don';t使用ksoap2从SOAP Web服务接收嵌套的XML节点,android,xml,nested,ksoap2,Android,Xml,Nested,Ksoap2,大家好, 我对这个问题越来越糊涂了。我希望有人能帮助我!! 我在网上搜索了一个解决方案,但我发现的每件事都不适合我。这是一个场景: 我正在尝试向.net ws发出请求。请求很简单,但响应是嵌套的2级XML结构,如下所示: <soap:Body> <ProgettoResponse xmlns="http://tempuri.org/"> <ProgettoResult xmlns=""> <Success>boo
<soap:Body>
<ProgettoResponse xmlns="http://tempuri.org/">
<ProgettoResult xmlns="">
<Success>boolean</Success>
<Message>string</Message>
<Progetto>
<Titolo>string</Titolo>
<Descrizione>string</Descrizione>
</Progetto>
</ProgettoResult>
</ProgettoResponse>
</soap:Body>
这些是ProgettoResult和Progetto的类
package feronia.culturando.android;
import java.util.Hashtable;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
public class ProgettoResult implements KvmSerializable {
private String pSuccess;
private String pMessage;
private Progetto pProgetto;
public Progetto getProgetto()
{
return pProgetto;
}
public void setProgetto(Progetto Progetto)
{
this.pProgetto = Progetto;
}
public ProgettoResult()
{
this.setSuccess("");
this.setMessage("");
}
public ProgettoResult(String Success, String Message)
{
this.setSuccess(Success);
this.setMessage(Message);
}
public Object getProperty(int arg0)
{
switch(arg0)
{
case 0:
return this.getSuccess();
case 1:
return this.getMessage();
case 2:
return this.getProgetto();
}
return null;
}
public int getPropertyCount()
{
return 3;
}
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info)
{
switch(index)
{
case 0:
info.name="Success";
info.type=PropertyInfo.STRING_CLASS;
break;
case 1:
info.name="Message";
info.type=PropertyInfo.STRING_CLASS;
break;
case 2:
info.name="Progetto";
info.type=Progetto.class;
break;
default:
break;
}
}
public void setProperty(int index, Object value)
{
switch(index)
{
case 0:
this.setSuccess(value.toString());
break;
case 1:
this.setMessage(value.toString());
break;
case 2:
this.setProgetto((Progetto)value);
break;
default:
break;
}
}
/*********** GET - SET *****************/
public void setSuccess(String Success)
{
this.pSuccess = Success;
}
public String getSuccess()
{
return pSuccess;
}
public void setMessage(String Message)
{
this.pMessage = Message;
}
public String getMessage()
{
return pMessage;
}
}
及
有人能告诉我哪里出了错吗???如果可以,请帮助我
================================================================================
非常感谢himanshu和shadesco对我的问题感兴趣!!这是我的活动类的代码,其中是调用函数。
此时调用的字符串a并不重要(尚未实现对它的控制:我传递了一个不重要的字符串),而INTB只是项目的che代码(progetto=2),其数据被请求到web服务
请求:
<soap:Body>
<Progetto xmlns="http://tempuri.org/">
<Guid>string</Guid>
<Id_Progetto>int</Id_Progetto>
</Progetto>
</soap:Body>
我认为这并不重要,但该方法的完整响应是:
<soap:Body>
<ProgettoResponse xmlns="http://tempuri.org/">
<ProgettoResult xmlns="">
<Success>boolean</Success>
<Message>string</Message>
<Progetto>
<Titolo>string</Titolo>
<Descrizione>string</Descrizione>
<Immagini>
<Immagine xsi:nil="true" />
<Immagine xsi:nil="true" />
</Immagini>
</Progetto>
</ProgettoResult>
</ProgettoResponse>
布尔值
一串
一串
一串
还有一个街区
但是请求progetto=2时,响应的这一部分不存在(该项目没有相关的图像和标记)
<Immagini />
未生成。我正在尝试一步一步地进行…尝试以下操作:
ProgettoResult pr = null;
try {
httpTransport.call(SOAP_ACTION, envelope);
pr = (ProgettoResult)envelope.getResponse();
} catch (Exception e) {
e.printStackTrace();
}
什么是
totalCount
?我总是在getPropertyInfo方法中使用相同的变量名,我的意思是:
你有
...
case 0:
info.name="Success";
info.type=PropertyInfo.STRING_CLASS;
break;
...
但是变量名为
private String pSuccess;
可能使用相同的名称:
...
case 0:
info.name="pSuccess";
info.type=PropertyInfo.STRING_CLASS;
break;
...
是的,佛朗哥,我不会继续在上面写我的评论,我会写在这里。
您的请求/响应的结构是准确的。 然而,答复是:
<ProgettoResult xmlns="">
<Success>boolean</Success>
<Message>string</Message>
<Progetto>
<Titolo>string</Titolo>
<Descrizione>string</Descrizione>
<Immagini>
<Immagine xsi:nil="true" />
<Immagine xsi:nil="true" />
</Immagini>
</Progetto>
然后你还需要在Progetto类中引用它。所以你需要为Immagini添加一个引用:
public class Progetto implements KvmSerializable{
private String pTitolo;
private String pDescrizione;
private Immagini immagini;
public Progetto()
{
this.setTitolo("");
this.setDescrizione("");
//Say put it null
immagini = null;
}
//continue the rest of the code
所以这意味着,你的回答是Progetto需要三个属性(Titolo、Descriptione、Immagini):
一串
一串
您现在已经为所有3个属性创建了一个引用。很可能响应需要3个属性计数,但您只给出了2个属性计数,因此它无法为其构建适当的数组,它构建了一个空的数组Progetto=anyType{}
让我知道这是否有效。你的活动类在哪里?发布该类的代码。@Franco什么是:字符串a,int b?它们与请求相关吗?如果是,发布请求的soap xml以更好地理解你是什么sending@Franco另外,您如何调用函数“Call(stringa,intb)”,展示一些code@Franco好了,所以guid现在不重要了……好了,Progetto是一个对象,你返回“totalCount=response.toString();”。好了,尝试3件事:1-而不是返回toString(),做“return envelope.getResponse();”,看看它给了你什么。2-在“try”之前做httpTransport.debug=true,然后在try System.out.println内(requestDump是:“+httpTransport.requestDump”);System.out.println(“responseDump是:“+httpTransport.responseDump”);请参阅logcat.3中给出的内容-尝试使用soapUI发送相同的请求(sourceforge.net/projects/soapUI)看看响应应该是什么样子只是一个疑问:由于在这种情况下Immagini为null,我创建了公共类Immagini实现KvmSerializable,就好像Imagonii是一个简单的字符串一样。实际上它是(来自wsdl)a type=“ArrayOfImmagine“其中Immagine是由两个字符串组成的coplex类型:dida和path。如果您认为这在这个阶段很重要,我将尝试为Immagini和Immagine构建正确的类,但我认为这对于我的实际级别来说有点太难了。我需要一点时间来找到正确的方法(这就是为什么我试图在没有图像的情况下测试ws)@Franco listen,尝试删除(注释掉)这两行:envelope.addMapping(名称空间,“ProgettoResult”,new ProgettoResult().getClass());envelope.addMapping(名称空间,“Progetto”,new Progetto().getClass());可能Progetto的映射与您应该发送的映射不同(1个字符串,1个int)…您映射的proGetto类用于响应,而不是请求。只需注释掉这两行并检查是否有任何更改..我按照您的建议做了,但什么也没有发生..我也尝试了相反的操作:添加envelope.addMapping(名称空间,“Immagini”,new Immagini().getClass());(我在添加新类时忘记添加此项)…我开始讨厌android:-(只是一件事:我经常在kvmserialization类的示例中发现,基本方法(getPropertyCount、getPropertyInfo等)声明为@override,但如果我尝试这样做,eclipse总是会出错“yyy类型的方法xxx必须重写一个超类方法”。它是常规的吗?@Franco别着急,兄弟,ksoap2需要耐心。我第一次使用它花了一些时间,但你做得很好!现在做这个:而不是info.type=Progetto.class;使用info.type=PropertyInfo.OBJECT\u class;
...
case 0:
info.name="pSuccess";
info.type=PropertyInfo.STRING_CLASS;
break;
...
<ProgettoResult xmlns="">
<Success>boolean</Success>
<Message>string</Message>
<Progetto>
<Titolo>string</Titolo>
<Descrizione>string</Descrizione>
<Immagini>
<Immagine xsi:nil="true" />
<Immagine xsi:nil="true" />
</Immagini>
</Progetto>
<Immagine xsi:nil="true" />
<Immagine xsi:nil="true" />
public class Immagini implements KvmSerializable{
//implement the overriden methods just like you did to Progetto
}
public class Progetto implements KvmSerializable{
private String pTitolo;
private String pDescrizione;
private Immagini immagini;
public Progetto()
{
this.setTitolo("");
this.setDescrizione("");
//Say put it null
immagini = null;
}
//continue the rest of the code
<Progetto>
<Titolo>string</Titolo>
<Descrizione>string</Descrizione>
<Immagini>
<Immagine xsi:nil="true" />
<Immagine xsi:nil="true" />
</Immagini>
</Progetto>