【问题标题】:Ksoap2 Android adding Attributes to a simple propertyKsoap2 Android将属性添加到一个简单的属性
【发布时间】:2012-03-19 08:18:15
【问题描述】:

我正在尝试在 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 on android。

【问题讨论】:

    标签: android properties attributes ksoap2


    【解决方案1】:

    好的,我已经解决了这个问题,方法如下:

    我创建了一个名为 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 版本中修复。

    【讨论】:

    • 现在这个问题已经解决了,您将如何使用您的代码示例为当前的 ksoap2 版本添加属性?你能再添加一个编辑吗?
    • 为我的情况想出来了,如果你在开始和结束标签之间没有文字,你可能想检查一下......重要的工作唐尼......
    • 您可以在此处下载库的更新版本:oss.sonatype.org/content/repositories/ksoap2-android-releases/…
    【解决方案2】:

    试试下面的代码

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

    【讨论】:

      【解决方案3】:

      您可以在您的肥皂对象中添加属性并传递您想要的任何值。

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

      就像一个键值对。

      【讨论】:

      • 如果我这样做,我无法向该属性添加属性。在您的情况下,我希望能够将该单元添加到 powerInKw。你写的输出到 1500
      【解决方案4】:

      我正在使用一些 .NET Web 服务,并且需要在为该 xml 使用 ksoap 时将 addAttribute 添加到 addProperty:

          <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 部分...如果您传入一个双精度值,那么该部分就在那里,以便肥皂可以正确序列化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多