Android Ksoap2 Настройка пространства имен для вложенных (дочерних) типов - PullRequest
0 голосов
/ 12 мая 2011

Я хочу отправить объект SBNInloggBegar веб-службе WCF.SBNInloggBegar содержит объекты SBPBegar и SBPInloggning, которые, в свою очередь, содержат ряд строк.SBPInloggning также содержит SBPSubjekt, содержащий ряд строк.Я сериализовал эти классы, используя интерфейс KvmSerializable.

У меня есть функция, которая выглядит следующим образом:

private String soap() {
    String returnString = "";

    String NAMESPACE = "Sambruk";
    String METHOD_NAME = "SBAInloggning";
    String SOAP_ACTION = "Sambruk/AuthenticationService/SBAInloggning";
    String URL = "http://exshaerpm.argentum.local/EliasTest/AuthenticationService/AuthenticationService.svc";

    SoapObject soapRequest = new SoapObject(NAMESPACE, METHOD_NAME);

    SBPBegar begar = new SBPBegar();
    begar.setKommun("Skellefteå kommun");

    SBPInloggning inloggning = new SBPInloggning();
    inloggning.setAnvandarnamn("hej");
    inloggning.setLosenord("hopp");

    SBNInloggBegar inloggbegar = new SBNInloggBegar();
    inloggbegar.setBegarData(begar);
    inloggbegar.setInloggningsData(inloggning);

    PropertyInfo prop = new PropertyInfo();
    prop.setName("request");
    prop.setNamespace("http://www.statskontoret.se/sambruk/nyttomeddelanden");
    prop.setType(inloggbegar.getClass());
    prop.setValue(inloggbegar);
    soapRequest.addProperty(prop);

    //soapRequest.addProperty("request", inloggbegar);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //****
    envelope.dotNet = true;
    envelope.implicitTypes = true;
    envelope.setAddAdornments(false);

    envelope.setOutputSoapObject(soapRequest);

    envelope.addMapping("http://www.statskontoret.se/sambruk/nyttomeddelanden", "", SBPBegar.class);
    envelope.addMapping("http://www.statskontoret.se/sambruk/nyttomeddelanden", "", SBPInloggning.class);
    envelope.addMapping("http://www.statskontoret.se/sambruk/sbpinloggning", "", SBPSubjekt.class);

    HttpTransportSE aht = new HttpTransportSE(URL);
    aht.debug = true;

    try
    {
        aht.call(SOAP_ACTION, envelope);
        //SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
        Object o = envelope.getResponse();
        SBNInloggSvar inloggSvar = new SBNInloggSvar((SoapObject) o);
        returnString = inloggSvar.toString();
    }
    catch(Exception e)
    {
        e.printStackTrace();
        returnString = e.toString();
    }
    return returnString;
}

Это то, что отправляется:

<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>
        <SBAInloggning xmlns="Sambruk">
            <n0:request                 
                xmlns:n0="http://www.statskontoret.se/sambruk/nyttomeddelanden">
                <BegarData>
                    <Kommun>Skellefte&#229; kommun</Kommun>
                    <AppNamn i:null="true" />
                    <AppVersion i:null="true" />
                    <MaxAntalSvar i:null="true" />
                    <AnropsId i:null="true" />
                    <LastDataVersion i:null="true" />
                </BegarData>
                <Inloggningsdata>
                    <anvandarID i:null="true" />                                
                    <anvandarnamn>hej</anvandarnamn>
                    <organisationsAnvID i:null="true" />
                    <losenord>hopp</losenord>
                    <aktor i:null="true" />
                    <subjekt i:null="true" />
                </Inloggningsdata>
            </n0:request>
        </SBAInloggning>
    </v:Body>
</v:Envelope>

Я не хочу устанавливать пространство имен для <request>.Вместо этого я хочу, чтобы пространство имен в <request> было установлено для <BegarData> и <InloggningsData>.Кроме того, я хочу, чтобы <BegarData> установил пространство имен для своих детей, и то же самое для <InloggningsData>, например:

...
<request xmlns:a="http://www.statskontoret.se/sambruk/nyttomeddelanden"     
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:BegarData xmlns:b="http://www.statskontoret.se/sambruk/sbpbegar">
        <b:Kommun>test</b:Kommun>
    ...
    </a:BegarData>
    <a:InloggningsData xmlns:b="http://www.statskontoret.se/sambruk/sbpinloggning">
        <b:AnvandarID></b:AnvandarID>
    ...
    </a:InloggningsData>
</request>
...

Есть ли способ сделать это?

Кстати, я использую версию 2.5.4 (с сайта Google Code).

1 Ответ

2 голосов
/ 18 мая 2011

Я не объявлял никакого пространства имен для request, но я добавил отображение для определенного типа, например:

envelope.addMapping("http://www.statskontoret.se/sambruk/nyttomeddelanden", "SBNInloggBegar", SBNInloggBegar.class);
envelope.addMapping("http://www.statskontoret.se/sambruk/sbpbegar", "SBPBegar", SBPBegar.class);
envelope.addMapping("http://www.statskontoret.se/sambruk/sbpinloggning", "SBPInloggning", SBPInloggning.class);
envelope.addMapping("http://www.statskontoret.se/sambruk/sbpsubjekt", "SBPSubjekt", SBPSubjekt.class);

Также я установил implicitTypes в true.

...