Ksoap2 Android добавляет атрибуты к простому свойству - PullRequest
2 голосов
/ 19 марта 2012

Я пытаюсь создать новое свойство внутри SoapObject, которое будет содержать простые строковые свойства с такими атрибутами:

<Power Unit="kw">1500</Power>

вот код, который я использую для моих образцов ниже.

final SoapObject powerObject= new SoapObject(namespace, "Power");
        powerObject.addAttribute("Unit", getPowerUnit());

        PropertyInfo powerObjectProperty = new PropertyInfo();
        powerObjectProperty .setName("");
        powerObjectProperty .type = String.class;
        powerObjectProperty .setValue(getPower());
        powerObjectProperty .addProperty(powerObjectProperty);
        root.addSoapObject(powerObject); // this is my root for the hierarchy

Лучшее, чего я мог достичь, это следующее:

<Power Unit="kw"><>1500</></Power>

Я даже пытался добавить все как строку, но это кодирует теги <>.

&ltPower Unit"kw"&gt1500&lt/Power&gt

Я использую:

ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar на android.

Ответы [ 4 ]

2 голосов
/ 19 марта 2012

Хорошо, я решил эту проблему, вот как:

Я создал новый объект мыла с именем TextSoapObject

public class TextSoapObject extends SoapObject {
    public static final String TAG = TextSoapObject.class.getSimpleName();

    public TextSoapObject(String namespace, String name) {
        super(namespace, name);
    }

    public String text;

    public void setText(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

Далее я переопределил конверт SoapSerialization следующим образом:

public class ValueSerializationEnvelope extends SoapSerializationEnvelope {

    public ValueSerializationEnvelope(int version) {
        super(version);
    }

    public static final String TAG = ValueSerializationEnvelope.class.getSimpleName();


    @Override
    public void writeObjectBody(XmlSerializer writer, KvmSerializable obj) throws IOException {
        if (obj instanceof TextSoapObject) {
            writer.text(((TextSoapObject) obj).getText());
        }
        super.writeObjectBody(writer, obj);
    }
}

И это все.

Чтобы использовать это, вы должны сделать следующее:

final TextSoapObject costOfRepairs = new TextSoapObject(namespace, "CostOfRepairs");
        costOfRepairs.addAttribute("Currency", getCurrency());
        costOfRepairs.setText(getRepairCosts() + "");
        root.addSoapObject(costOfRepairs);

РЕДАКТИРОВАТЬ:

Эта проблема имеетбыл распознан для библиотеки ksoap2 и адресован здесь:

http://code.google.com/p/ksoap2-android/issues/detail?id=112

Должен быть исправлен в следующей версии ksoap2.

2 голосов
/ 05 июня 2013

Попробуйте следующий код

SoapObject soOriginDestInfo = new SoapObject(namespace_ns, "OriginDestinationInformation");
SoapPrimitive spDeptDtTm = new SoapPrimitive(namespace_ns, "DepartureDateTime", "asdadsad");
spDeptDtTm.addAttribute("Unit", "kw");
soOriginDestInfo.addProperty("DepartureDateTime", spDeptDtTm);
request.addSoapObject(soOriginDestInfo);
0 голосов
/ 08 января 2014

Я использую некоторые веб-службы .NET и мне нужно добавить атрибут addProperty при использовании ksoap для этого xml:

    <Element FirstAttribute="int" SecondAttribute="double" />

Вот что я сделал (включая дополнительную циклическую справку и двойную передачу), чтобы передать этот запрос:

    String xml = null;
    final String NAMESPACE = "http://yournamespace.org/";
    final String SOAP_ACTION = "http://yournamespace.org/NameOfYourOperation";
    final String METHOD_NAME = "NameOfYourOperation";
    final String URL = "http://whereyourserviceis.com/Service.asmx";
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    for (int i=0; i < anArray.size(); i++)
    {
        Some_obj obj = anArray.get(i);
        SoapObject attributes = new SoapObject(NAMESPACE, "Element");
        int a = Integer.parseInt(obj.someIntString);
        attributes.addAttribute("FirstAttribute", a);
        Double v = Double.parseDouble(obj.someDoubleString);
        attributes.addAttribute("Value", v);
        request.addProperty("SecondAttribute", attributes);
        //request.addSoapObject(request);
        Log.d(TAG,"=======obj.someIntString======: " + a + "=======obj.someDoubleString========: " + v);
    }
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    MarshalFloat md = new MarshalFloat();
    md.register(envelope);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    envelope.implicitTypes = true;
    envelope.setAddAdornments(false);

    try
    {
        HttpTransportSE transport = new HttpTransportSE(URL, 60000);
        transport.debug = true;
        transport.call(SOAP_ACTION, envelope);
        xml = transport.responseDump.toString();
        Log.d(TAG, "getUpdates===============" + xml);
    }
    catch(SocketException ex)
    {
        Log.e("SocketException : " , "Error on getUpdates() " + ex.getMessage());
    }
    catch (Exception e)
    {
        Log.e("Exception : " , "Error on getUpdates() " + e.getMessage());
    }

Обратите внимание на часть MarshalFloat ... это здесь, если вы передаете двойное значение, чтобы мыло могло сериализоваться должным образом.

0 голосов
/ 19 марта 2012

Вы можете добавить свойство в свой объект мыла и передать любое желаемое значение.

SoapObject request = new SoapObject(NAMESPACE, NAME);
request.addProperty("powerInKw", 1500);

как пара ключ-значение.

...