Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Don';t使用ksoap2从SOAP Web服务接收嵌套的XML节点_Android_Xml_Nested_Ksoap2 - Fatal编程技术网

Android Don';t使用ksoap2从SOAP Web服务接收嵌套的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

大家好, 我对这个问题越来越糊涂了。我希望有人能帮助我!! 我在网上搜索了一个解决方案,但我发现的每件事都不适合我。这是一个场景: 我正在尝试向.net ws发出请求。请求很简单,但响应是嵌套的2级XML结构,如下所示:

<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>