【问题标题】:Is there a better way of parsing SoapObject in Android有没有更好的方法在 Android 中解析 SoapObject
【发布时间】:2012-10-16 13:02:23
【问题描述】:

到目前为止,我已成功连接到 Web 服务并获得了 SoapObject 响应,但我在缩小良好、干净的解析方式时遇到了麻烦。搜索互联网并没有真正产生太多结果,每个人都有不同的方式和不同的过程,通常针对他们自己的 Web 服务,使其成为一次性使用类型的解决方案。基本上,下面是我从 Web 服务得到的响应

anyType{
 schema=anyType{
  element=anyType{
   complexType=anyType{
    choice=anyType{
     element=anyType{
      complexType=anyType{
       sequence=anyType{
        element=anyType{}; 
           element=anyType{}; 
            element=anyType{}; 
              element=anyType{}; }; }; }; }; }; }; };   
      diffgram=anyType{
         NewDataSet=anyType{
          Rep_x0020_Information=anyType{
            Login=CorrectLogin; Password=InCorrectPass; }; }; }; }

基本上我希望能够解析出两个重要字段(登录名和密码)。根据我阅读的内容,我尝试根据属性计数迭代 SoapObject 响应,但这似乎不起作用。当我尝试时,我得到的响应属性计数为 2,所以我最终做了以下类似的事情:

SoapObject response=(SoapObject) envelope.getResponse();

                if  (response != null) {
                    Log.i("Message", "the response contains: " + response.toString());
                    SoapObject diffgram = (SoapObject) response.getProperty("diffgram");
                    SoapObject NewDataSet = (SoapObject) diffgram.getProperty("NewDataSet");
                    SoapObject RepInfo = (SoapObject) NewDataSet.getProperty("Rep_x0020_Information");
                    for (int i = 0; i < RepInfo.getPropertyCount(); i++) {
                        PropertyInfo info = new PropertyInfo();
                        RepInfo.getPropertyInfo(i, info);
                        Log.d("Info", info.name + " : " + RepInfo.getProperty(i).toString());
                    }


 //which gives the following message in LogCat
  D/Info(716): Login : InCorrectLogin
  D/Info(716): Password : InCorrectPass

这个过程有效,因为在最后一个循环中我得到了我想要的两个对象,但我只是觉得有一种更清洁的方式来做这件事。我只是问,因为随着我深入了解这个应用程序,将会进行一些更复杂的 Web 服务调用,我希望能够在整个应用程序中拥有可重用的东西,而不必为每个请求构建几个 SoapObjects 只是为了得到到我想要的对象。

【问题讨论】:

  • 我觉得,可以用JSONObject,json解析很简单

标签: android web-services parsing ksoap2


【解决方案1】:

有两种方法可以从 Web 服务中解析对象:
首先,假设您是 Web 服务的所有者或创建者,您可以让 Web 服务返回一个 Json 字符串,然后从客户端,您可以创建 Json 的实体映射,Json 库会为您进行解析。

第二:Web服务通常会响应很多复杂的对象,所以你可以制作实体来映射这些对象。
您可以关注this tutorial 了解如何映射简单对象,然后转到this question 我的回答了解如何解析复杂对象。
就是这样:

 HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVER_URL);
 androidHttpTransport.call(SOAP_ACTION, envelope);// call
 Entity entity = (Entity)envelope.bodyIn;

【讨论】:

  • 感谢您的提示,我将研究 Web 服务如何提供数据,看看是否可以让它返回 JSON 字符串。 WEB 服务将被各种移动平台使用(现在它在 iOS 上,我在 Android 上工作,然后是 Windows Phone)。
  • 你能帮忙回答这个问题吗? stackoverflow.com/questions/26903238/…
【解决方案2】:

您可以通过在 HttpTransportSE 中设置调试属性并在调用后立即获取 requestDump 和/或 responseDump 以更简单的方式获取响应(和请求)xml。像这样的:

HttpTransportSE  httpTransport = new HttpTransportSE(wsURL);
httpTransport.debug = true;

httpTransport.call("WS_NAMESPACE" + methodName, envelope);

Log.w("RawXML Request:" + httpTransport.requestDump);
Log.w("RawXML Response:" + httpTransport.responseDump);

您甚至可以在 try catch 块中使用它来分析肥皂错误。

使用后不要忘记禁用调试,因为它会降低性能,在这种情况下,那些 Dump 属性将为空。

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多