【问题标题】:Expecting Nested XML structure but receiving SOAP structure期望嵌套 XML 结构但接收 SOAP 结构
【发布时间】:2012-06-15 09:52:54
【问题描述】:

我正在制作一个从 Web 服务(实现 Soap)请求数据的应用。

正在查看此内容的人请在 cmets 中发表疑问...我没有得到任何答复,如果有任何疑问,请询问我,我真的需要帮助,我被困住了!!

所以要发出请求,我必须使用 ksoap 库.. Web 服务被编码为返回 XML 类型的响应。当 Web 服务本身在浏览器上进行测试时,它会显示如下结果:

?xml version="1.0" encoding="utf-8" ?> 
- <SOBKeyList>
- <Key>
  <value>12686</value> 
  </Key>
- <Key>
  <value>16238</value> 
  </Key>
- <Key>
  <value>26978</value> 
  </Key>
  </SOBKeyList>

显然是一个 XML 文件...

However 当我使用这个代码得到结果时:

    public String getXmlFromUrl(String url) {
    // TODO Auto-generated method stub
    String xml = null;
    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);
    PropertyInfo pi = new PropertyInfo();

    pi.setName("fkey");
    pi.setValue(0);
    pi.setType(Integer.class);
    request.addProperty(pi);

    pi = new PropertyInfo();

    pi.setName("tkey");
    pi.setValue(999999);
    pi.setType(Integer.class);
    request.addProperty(pi);


    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE httpTransport = new HttpTransportSE(url);
    Object response = null; 

    try {
        httpTransport.call(SOAP_ACTION, envelope);
        response = envelope.getResponse();
        xml = response.toString();
        Log.d("xml:", xml);
    } catch (SoapFault e) {
        // TODO Auto-generated catch block
        Log.d("Soap Fault", e.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Log.d("IOexception", e.toString());
    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        Log.d("XmlPullParserException", e.toString());
    }

    return xml;
}

它返回一个 嵌套的 SOAP 结构 确认 由我制作的日志条目 (Log.d("xml:", xml);) 对应的 LogCat 条目是:(我已经对其进行了格式化,以使其成为 SOAP 结构的层次结构……)

anyType{
      SOBKeyList=anyType{
                          Key=anyType{value=12686 ; };
                          Key=anyType{value=16238 ; };
                          Key=anyType{value=26978 ; };
                         };
          }

我之所以需要 XML,是因为后来我解析字符串以获取 DOM 元素,当传递上述字符串时,它返回以下内容:

org.xml.sax.SAXParseException:意外令牌(位置:TEXT anyType{SOBKeyLi...@1:119 in java.io.StringReader@40ec9c68)

从那以后,我的整个代码也取决于响应是 XML 的事实。

解释我期望 XML 的原因: 现在你可能会问为什么我在没有测试 Web 服务的情况下编写应用程序需要 XML利用 SOAP 结构的代码! -_- 我正在修复中。请帮忙!

【问题讨论】:

    标签: android xml soap xml-serialization ksoap2


    【解决方案1】:

    试试这个:

    String responseXML = httpTransport.responseDump;
    
    • HttpTransportSE.responseDump 以 XML 格式回复您。
    • HttpTransportSE.requestDump 为您提供 XML 格式的请求。

    但是,为了能够更改和检索这些值中的任何一个,您必须将 HttpTransportSEdebug 字段设置为 true 所以你的代码应该看起来像......

        HttpTransportSE httpTransport = new HttpTransportSE(url);
        httpTransport.debug =true;      
        try {
            httpTransport.call(SOAP_ACTION, envelope);          
            xml = httpTransport.responseDump;
            Log.d("xml:", "is:" + xml);     
        }
    

    你也可以像下面这样解析你的响应:

    ArrayList<String> listValues = new ArrayList<String>();
    
                httpTransport.call(SOAP_ACTION, envelope);
                SoapObject response = (SoapObject) envelope.getResponse();
    
                SoapObject soapSOBKeyList = (SoapObject) response.getProperty("SOBKeyList");
    
                int keyCount = soapSOBKeyList.getPropertyCount();
    
                for (int i = 0; i < keyCount; i++) {
                    String value = soapSOBKeyList.getPropertyAsString(i);
                    listValues.add(value);
                }
    
                return listValues;
    

    【讨论】:

    • 我刚刚意识到我发布了一些错误的代码(我也在问题中进行了编辑):HttpTransportSE httpTransport = new HttpTransportSE(url); Object response = null; try { httpTransport.call(SOAP_ACTION, envelope); response = envelope.getResponse(); xml = response.toString(); Log.d("xml:", xml); }
    • 我已经在使用 HttpTransportSE ... 我应该把httpTransport.responseDump 的行放在哪里??
    • httpTransport.call(SOAP_ACTION, envelope); xml = androidHttpTransport.responseDump;
    • 现在我编辑了我的答案。您可以解析您的非 XML :) 响应。
    • httpTransport.call(SOAP_ACTION, envelope); xml = httpTransport.responseDump; Log.d("xml:", "is:" + xml); //response = (SoapObject) envelope.getResponse(); //xml = response.toString();
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2013-10-20
    相关资源
    最近更新 更多