XmlPullParserException:expected:START_TAG< ...定义

时间:2012-10-19 10:20:21

标签: java android android-ksoap2

这是我为连接到android的WSDL(Yii)Web服务调用创建的php。但是我得到了

10-19 11:17:36.068: W/System.err(11165): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <{http://schemas.xmlsoap.org/wsdl/}wsdl:definitions name='StatisticController' targetNamespace='http://example.com/webservice/statistic/'>@13:91 in java.io.InputStreamReader@40539de0) 

XML:

<wsdl:definitions name="StatisticController" targetNamespace="http://example.com/webservice/statistic/">
  <wsdl:message name="getGeneralstatRequest"/>
  <wsdl:message name="getGeneralstatResponse">
     <wsdl:part name="return" type="xsd:struct"/>
  </wsdl:message>
  <wsdl:portType name="StatisticControllerPortType">
     <wsdl:operation name="getGeneralstat">
       <wsdl:documentation/>
       <wsdl:input message="tns:getGeneralstatRequest"/>
       <wsdl:output message="tns:getGeneralstatResponse"/>
     </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="StatisticControllerBinding" type="tns:StatisticControllerPortType">
     <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
     <wsdl:operation name="getGeneralstat">
        <soap:operation soapAction="http://example.com/webservice/statistic/getGeneralstat" style="rpc"/>
        <wsdl:input>
           <soap:body use="encoded" namespace="http://example.com/webservice/statistic/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </wsdl:input>
        <wsdl:output>
           <soap:body use="encoded" namespace="http://example.com/webservice/statistic/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </wsdl:output>
     </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="StatisticControllerService">
      <wsdl:port name="StatisticControllerPort" binding="tns:StatisticControllerBinding">
          <soap:address location="http://example.com/webservice/statistic/ws/1"/>
      </wsdl:port>
   </wsdl:service>

Webservice正在运作。我使用http://www.validwsdl.com/

进行了测试

Java代码:

    private static String domain_name = URLEncoder.encode("example.com");
    private static final String METHOD_NAME = "getGeneralstat";
    private static final String NAMESPACE = "http://"+ domain_name +"/webservice/statistic/";
    //private static final String URL = "http://"+ domain_name +"/webservice/statistic/";
    private static final String URL = "http://"+ domain_name +"/webservice/generalstat2.wsdl";
   private static final String SOAP_ACTION = NAMESPACE + METHOD_NAME;
...
   SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
   SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
   envelope.setOutputSoapObject(request);
   HttpTransportSE ht = new HttpTransportSE(URL,8000); // trying 8 sec  
   try {    
     ht.debug = true;
     ht.call(SOAP_ACTION, envelope);
...
   } catch ...
   } catch ...
   } catch (XmlPullParserException xe) {
   } catch ...

我已经尝试了3个星期,但它没有用。我已经阅读了很多主题,但没有解决我的问题。

2 个答案:

答案 0 :(得分:1)

XMLParserException可能会在两点抛出。

  1. 当库尝试在调用之前生成SoapObject时
  2. 在调用之后,当响应对象不是有效的XML时(例如,您可以获得 带有服务器错误的HTML响应)
  3. 调试Webservice调用并检查HTTPTransportSE对象的转储变量,以确定您的XML是否有效。您还可以将转储变量的内容复制粘贴到soapUI中,以检查哪些xml部分无法正常工作。

    这对我有很多帮助http://mspmsp.brinkster.net/MobileJava/ch16.htm

    我希望它有所帮助。

答案 1 :(得分:0)

你给定的wsdl绝对不正确:缺少一些名称空间声明加上 wsdl:definitions标签未在文件末尾正确关闭(可能是复制+粘贴错误)。这是一个更正版本:

<wsdl:definitions name="StatisticController" 
targetNamespace="http://example.com/webservice/statistic/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://example.com/webservice/statistic/">
  <wsdl:message name="getGeneralstatRequest"/>
  <wsdl:message name="getGeneralstatResponse">
     <wsdl:part name="return" type="xsd:struct"/>
  </wsdl:message>
  <wsdl:portType name="StatisticControllerPortType">
     <wsdl:operation name="getGeneralstat">
       <wsdl:documentation/>
       <wsdl:input message="tns:getGeneralstatRequest"/>
       <wsdl:output message="tns:getGeneralstatResponse"/>
     </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="StatisticControllerBinding" type="tns:StatisticControllerPortType">
     <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
     <wsdl:operation name="getGeneralstat">
        <soap:operation soapAction="http://example.com/webservice/statistic/getGeneralstat" style="rpc"/>
        <wsdl:input>
           <soap:body use="encoded" namespace="http://example.com/webservice/statistic/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </wsdl:input>
        <wsdl:output>
           <soap:body use="encoded" namespace="http://example.com/webservice/statistic/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </wsdl:output>
     </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="StatisticControllerService">
      <wsdl:port name="StatisticControllerPort" binding="tns:StatisticControllerBinding">
          <soap:address location="http://example.com/webservice/statistic/ws/1"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

我建议将WSDL导入soapUI,作为一个快速简单的验证步骤。