0

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

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

所以要发出请求,我必须使用 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 条目 确认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 的应用程序,原因是:Web 服务是由向我保证 XML 响应的第三方编码的,现在我没有足够的时间来更改我剩余的代码来利用 SOAP 结构!-_- 我正在修复中。请帮忙!

4

1 回答 1

1

试试这个:

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

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

    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;
于 2012-06-15T11:06:01.757 回答