Ksoap2 Android-如何为复杂对象的子属性指定名称空间? [英] Ksoap2 Android - how to specify a namespace for the child properties of a complex object?

查看:60
本文介绍了Ksoap2 Android-如何为复杂对象的子属性指定名称空间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用KSoap2 Android将复杂的对象上载到WCF Web服务,并且这样做有些困难.使用SoapUI并手动填写数据时,我已经成功调用了Web服务.成功的SoapUI生成的请求如下:

I'm trying to upload a complex object to a WCF webservice using KSoap2 Android and having some difficulty doing this. I have achieved successful calls to the webservice when I use SoapUI and fill in the data by hand. The successful SoapUI-generated request is as follows:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:fpm="http://schemas.datacontract.org/2004/07/FPMobileServices">
<soapenv:Header/>
<soapenv:Body>
  <tem:CommitOne>
     <tem:qr>
        <fpm:ClientID>8aa2f6a4-4d15-4b4c-9cac-fb2478d0d27a</fpm:ClientID>
        <fpm:CreatedBy>admin</fpm:CreatedBy>
        <fpm:CreatedDate>2012-03-01T19:50:37</fpm:CreatedDate>
        <fpm:DimensionID>8a02a339-b5a7-4c76-b95f-5891ef57736d</fpm:DimensionID>
        <fpm:ImageID>b76c7bcc-a8f8-49ff-94c6-08cd2e05b1a8</fpm:ImageID>
        <fpm:IndicatorID>4637b333-701d-4d03-a708-4de48569be84</fpm:IndicatorID>
        <fpm:LoanOperationNumber>6-2011-72978</fpm:LoanOperationNumber>
        <fpm:ModifiedBy>admin</fpm:ModifiedBy>
        <fpm:ModifiedDate>2012-03-01T19:50:37</fpm:ModifiedDate>
        <fpm:QuestionaireCompletedDate>2012-03-01T19:50:54</fpm:QuestionaireCompletedDate>
        <fpm:QuestionnaireID>99967f70-8161-4922-929f-03136a389ba6</fpm:QuestionnaireID>
        <fpm:ResultID>95fa03b5-80af-479d-9dec-f2bf94baf3cd</fpm:ResultID>
        <fpm:ResultWeighting>0</fpm:ResultWeighting>
        <fpm:StatusLevelID>03a91cd6-93cd-4503-a676-efa2967e82a7</fpm:StatusLevelID>
        <fpm:UploadID>141D6A1F-8FFD-4CA4-8073-009338F22B13</fpm:UploadID>
     </tem:qr>
  </tem:CommitOne>
</soapenv:Body>
</soapenv:Envelope>

我的Java代码生成的请求是:

The request generated by my Java code is:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
    <CommitOne xmlns="http://tempuri.org/" id="o0" c:root="1">
        <qr>
            <ClientID>8aa2f6a4-4d15-4b4c-9cac-fb2478d0d27a</ClientID>
            <LoanOperationNumber>6-2011-72978</LoanOperationNumber>
            <CreatedBy i:null="true" />
            <CreatedDate>2012-03-01T19:50:37</CreatedDate>
            <DimensionID>8a02a339-b5a7-4c76-b95f-5891ef57736d</DimensionID>
            <ImageID>b76c7bcc-a8f8-49ff-94c6-08cd2e05b1a8</ImageID>
            <IndicatorID>4637b333-701d-4d03-a708-4de48569be84</IndicatorID>
            <ModifiedBy i:null="true" />
            <ModifiedDate i:null="true" />
            <QuestionnaireCompletedDate>2012-03-01T19:50:54</QuestionnaireCompletedDate>
            <QuestionnaireID>99967f70-8161-4922-929f-03136a389ba6</QuestionnaireID>
            <ResultID i:type="d:string">95fa03b5-80af-479d-9dec-f2bf94baf3cc</ResultID>
            <ResultWeighting>0</ResultWeighting>
            <StatusLevelID>03a91cd6-93cd-4503-a676-efa2967e82a7</StatusLevelID>
            <UploadID i:type="d:string">8ffa3665-b691-486f-91a0-ebbe8575896c</UploadID>
        </qr>
    </CommitOne>
</v:Body>

两者之间的主要区别似乎是前缀/命名空间.由于某种原因,当"qr"对象到达我的.NET代码时,其所有属性均为null/零.

The main difference between the two seems to be the prefixes/namespaces. For some reason when the "qr" object arrives in my .NET code, all its properties are null/zero.

我在Java代码中尝试了2种不同的方法,试图将"qr"对象设置为PropertyInfo:

I have tried 2 different approaches in my java code, trying to set my "qr" object as a PropertyInfo:

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    // build request object 
    PropertyInfo qrPi = new PropertyInfo();
    qrPi.setName("qr");
    qrPi.setType(qr.getClass());
    qrPi.setValue(qr);

    request.addProperty(qrPi); 

还将我的"qr"设置为一个SoapObject,然后使用.addProperty:

And also setting my "qr" as a SoapObject and then using .addProperty:

    SoapObject result = new SoapObject(NAMESPACE, "qr");
    result.addProperty("ClientID", (String) qr.getClientID());
    result.addProperty("CreatedBy", (String) qr.getCreatedBy());
    result.addProperty("CreatedDate", (String) qr.getCreatedDate());
    result.addProperty("DimensionID", (String) qr.getDimensionID());
    result.addProperty("ImageID", (String) qr.getImageID());
    result.addProperty("IndicatorID", (String) qr.getIndicatorID());
    result.addProperty("LoanOperationNumber", (String) qr.getLoanOperationNumber());
    result.addProperty("ModifiedBy", (String) qr.getModifiedBy());
    result.addProperty("ModifiedDate", (String) qr.getModifiedDate());
    result.addProperty("QuestionnaireCompletedDate", (String) qr.getQuestionnaireCompletedDate());
    result.addProperty("QuestionnaireID", (String) qr.getQuestionnaireID());
    result.addProperty("ResultID", (String) qr.getResultID());
    result.addProperty("ResultWeighting", qr.getResultWeighting());
    result.addProperty("StatusLevelID", (String) qr.getStatusLevelID());
    result.addProperty("UploadID", (String) qr.getUploadID());

    request.addSoapObject(result); 

但是,这两种方法都得到相同的结果-当我的"qr"对象进入我的Web服务时,其所有字段均为空.我一直在StackOverflow上寻找类似的问题,并发现了,但我不知道如何将其应用于我自己的情况.

But both of these approaches get the same result - all my "qr" object's fields are null when it gets into my webservice. I have been looking for similar questions on StackOverflow and found this but I can't figure out how to apply it to my own case.

任何人都可以帮助阐明情况吗?

Can anyone help shed any light on the situation?

推荐答案

不确定我是否应该回答自己的问题,但是我已经找到了解决方案,并将其留给有类似问题的任何人使用.

Not sure if I'm supposed to answer my own question, but I've figured out a solution and will leave it here for anyone who has a similar issue.

键是不同的名称空间.在SoapUI生成的示例中,我们可以看到子元素(ClientID等)使用fpm命名空间,而它们上方的元素使用tem命名空间.为了显式指定这些子元素的名称空间,我更改了上面讨论的第二种方法-我为每个子元素创建了PropertyInfo对象,并将它们添加到SoapObject中.

The key is different namespaces. In the SoapUI generated example we can see that the child elements (ClientID etc) use the fpm namespace, while the elements above them use the tem namespace. To explicitly specify the namespace for these child elements, I altered the 2nd approach discussed above - I created PropertyInfo objects for each child element and added them to the SoapObject.

代替使用:

result.addProperty(String "ClientID", Object qr.getClientID());

我用过:

PropertyInfo pi = new PropertyInfo();
pi.setNamespace(QR_NAMESPACE);
pi.setType(PropertyInfo.STRING_CLASS);
pi.setName("ClientID");
pi.setValue(qr.getClientID()); 
result.addProperty(pi);

当我对所有属性执行此操作时,它工作正常.

When I did this with all the properties, it worked fine.

希望有一天能对别人有所帮助!

Hope this helps someone else some day!

这篇关于Ksoap2 Android-如何为复杂对象的子属性指定名称空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆