【问题标题】:Android : Ksoap2 org.xmlpull.v1.XmlPullParserException安卓:Ksoap2 org.xmlpull.v1.XmlPullParserException
【发布时间】:2013-11-18 10:04:30
【问题描述】:

我是在 Android 上使用 KSOAP2 的新手,我遇到了问题

我看到过关于同一问题的类似帖子,但没有人帮助我解决我的错误

我正在尝试连接到返回我登录时使用的用户名的 Web 服务 (WSDL)。 当我在任何浏览器中打开 Web 服务 URL 时,它首先要求输入用户名和密码,然后将这个用户名返回给我,在代码中我不确定如何发送这个用户名和密码。我也需要这方面的帮助

下面是我的代码:

package com.example.webservicetest;


import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class AndroidWSClientActivity extends Activity {

    static final int CONNECTING_PROGRESS_DIALOG = 0;

    private static final String TAG = "MeGetCurrentUserId";

    private static final String WSDL_URL = "http://IP:8010/sap/bc/srt/wsdl/srvc_000C293D85161ED39484844BDA759A86/wsdl11/allinone/ws_policy/document?sap-client=200&sap-user=*********&sap-password=********";
private static final String WS_NAMESPACE = "urn:sap-com:document:sap:soap:functions:mc-style";

private static final String WS_METHOD_NAME = "MeGetCurrentUserId";
private static final String soapAction = "urn:sap-com:document:sap:soap:functions:mc-style:ZUSER_ID:MeGetCurrentUserIdRequest";//"urn:sap-com:document:sap:soap:functions:mc-style:ZME_GET_CURRENT_USER_ID3:MeGetCurrentUserIdRequest";


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_wsclient);

        new GetUserNameTask().execute();


    }

    private String parseSOAPResponse(SoapObject response) {
        String result = null;
        SoapObject usernameResult  = (SoapObject) response
                .getProperty("MeGetCurrentUserIdResponse");
        if (usernameResult != null) {

            for (int i = 0; i < usernameResult  .getPropertyCount(); i++) {
                SoapObject unameDescription = (SoapObject) usernameResult
                        .getProperty(i);
                String Username = unameDescription
                        .getPrimitivePropertySafelyAsString("Username");

                Log.i(TAG, Username);
                result = Username;
            }
        }

        return result;
    }

    private class GetUserNameTask extends AsyncTask<Void, Void, String> {

        @Override
        protected void onPreExecute() {
            showDialog(CONNECTING_PROGRESS_DIALOG);
        }

        @Override
        protected String doInBackground(Void... params) {
            String result=null;
            final String str = null;
            try {

    SoapObject request = new SoapObject(WS_NAMESPACE, WS_METHOD_NAME);

            MarshalBase64 mbase = new MarshalBase64();

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

            envelope.bodyOut = request;
            envelope.encodingStyle = SoapSerializationEnvelope.ENV;
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);

            androidHttpTransport = new HttpTransportSE(WSDL_URL);

            mbase.register(envelope);

            androidHttpTransport.call(soapAction, envelope);

            Log.d(TAG, "HTTP REQUEST:\n" + androidHttpTransport.requestDump);
            Log.d(TAG, "HTTP RESPONSE:\n" + androidHttpTransport.responseDump);

            final  SoapPrimitive resp = (SoapPrimitive)envelope.getResponse();

            Log.d(TAG, "HTTP resp:\n" + resp);

            Object resonse=envelope.getResponse();

            String output = resonse.toString();
                if (envelope.bodyIn instanceof SoapObject) { // SoapObject = SUCCESS
                    SoapObject soapObject = (SoapObject) envelope.bodyIn;
                    result = parseSOAPResponse(soapObject);
                    Log.v("result", "result = "+result);

                } else if (envelope.bodyIn instanceof SoapFault) { // SoapFault =               // FAILURE
                    SoapFault soapFault = (SoapFault) envelope.bodyIn;
                    try {
                        throw new Exception(soapFault.getMessage());
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        }

        @Override
        protected void onPostExecute(String response) {
            removeDialog(CONNECTING_PROGRESS_DIALOG);
        }

    }
    @Override
    protected Dialog onCreateDialog(int id) {

        switch (id) {
        case CONNECTING_PROGRESS_DIALOG: {
            ProgressDialog loadingDialog = new ProgressDialog(this);
            loadingDialog.setMessage("Connecting");
            loadingDialog.setIndeterminate(true);
            loadingDialog.setCancelable(false);
            return loadingDialog;
        }
        }

        return null;
    }

}

我收到以下错误:

11-19 15:30:46.520: W/System.err(29600): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <{http://schemas.xmlsoap.org/wsdl/}wsdl:definitions targetNamespace='urn:sap-com:document:sap:soap:functions:mc-style'>@1:687 in java.io.InputStreamReader@408e2840) 
11-19 15:30:46.520: W/System.err(29600):    at org.kxml2.io.KXmlParser.require(KXmlParser.java:2037)
11-19 15:30:46.520: W/System.err(29600):    at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:128)
11-19 15:30:46.520: W/System.err(29600):    at org.ksoap2.transport.Transport.parseResponse(Transport.java:100)
11-19 15:30:46.520: W/System.err(29600):    at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:197)
11-19 15:30:46.520: W/System.err(29600):    at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
11-19 15:30:46.520: W/System.err(29600):    at com.example.webservicetest.AndroidWSClientActivity$GetUserNameTask.doInBackground(AndroidWSClientActivity.java:95)
11-19 15:30:46.520: W/System.err(29600):    at com.example.webservicetest.AndroidWSClientActivity$GetUserNameTask.doInBackground(AndroidWSClientActivity.java:1)
11-19 15:30:46.520: W/System.err(29600):    at android.os.AsyncTask$2.call(AsyncTask.java:252)
11-19 15:30:46.520: W/System.err(29600):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-19 15:30:46.520: W/System.err(29600):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-19 15:30:46.520: W/System.err(29600):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
11-19 15:30:46.520: W/System.err(29600):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
11-19 15:30:46.520: W/System.err(29600):    at java.lang.Thread.run(Thread.java:1020)

错误在这一行

httpTransport.call(soapAction, envelope);

这是我的 WSDL

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="urn:sap-com:document:sap:soap:functions:mc-style" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:n1="urn:sap-com:document:sap:rfc:functions" targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style">
<wsdl:documentation>
<sidl:sidl xmlns:sidl="http://www.sap.com/2007/03/sidl"/>
</wsdl:documentation>
<wsp:UsingPolicy wsdl:required="true"/>
<wsp:Policy wsu:Id="BN_BN_ZME_GET_CURRENT_USER_ID">
<saptrnbnd:OptimizedXMLTransfer xmlns:saptrnbnd="http://www.sap.com/webas/710/soap/features/transportbinding/" uri="http://xml.sap.com/2006/11/esi/esp/binxml" wsp:Optional="true"/>
<saptrnbnd:OptimizedMimeSerialization xmlns:saptrnbnd="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" wsp:Optional="true"/>
<wsp:ExactlyOne xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsp:All>
<sp:TransportBinding xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken>
<wsp:Policy>
<sp:HttpBasicAuthentication/>
</wsp:Policy>
</sp:HttpsToken>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128Rsa15/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
</wsp:ExactlyOne>
<wsaw:UsingAddressing xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" wsp:Optional="true"/>
</wsp:Policy>
<wsp:Policy wsu:Id="BN_BN_ZME_GET_CURRENT_USER_ID_SOAP12">
<saptrnbnd:OptimizedXMLTransfer xmlns:saptrnbnd="http://www.sap.com/webas/710/soap/features/transportbinding/" uri="http://xml.sap.com/2006/11/esi/esp/binxml" wsp:Optional="true"/>
<saptrnbnd:OptimizedMimeSerialization xmlns:saptrnbnd="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" wsp:Optional="true"/>
<wsp:ExactlyOne xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsp:All>
<sp:TransportBinding xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/policy" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken>
<wsp:Policy>
<sp:HttpBasicAuthentication/>
</wsp:Policy>
</sp:HttpsToken>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128Rsa15/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
</wsp:ExactlyOne>
<wsaw:UsingAddressing xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" wsp:Optional="true"/>
</wsp:Policy>
<wsp:Policy wsu:Id="IF_IF_zME_GET_CURRENT_USER_ID">
<sapsession:Session xmlns:sapsession="http://www.sap.com/webas/630/soap/features/session/">
<sapsession:enableSession>false</sapsession:enableSession>
</sapsession:Session>
<sapcentraladmin:CentralAdministration xmlns:sapcentraladmin="http://www.sap.com/webas/700/soap/features/CentralAdministration/" wsp:Optional="true">
<sapcentraladmin:BusinessApplicationID>000C293D85161EE392C16B764ABA0F3C</sapcentraladmin:BusinessApplicationID>
</sapcentraladmin:CentralAdministration>
</wsp:Policy>
<wsp:Policy wsu:Id="OP_IF_OP_MeGetCurrentUserId">
<sapcomhnd:enableCommit xmlns:sapcomhnd="http://www.sap.com/NW05/soap/features/commit/">false</sapcomhnd:enableCommit>
<sapblock:enableBlocking xmlns:sapblock="http://www.sap.com/NW05/soap/features/blocking/">true</sapblock:enableBlocking>
<saptrhnw05:required xmlns:saptrhnw05="http://www.sap.com/NW05/soap/features/transaction/">no</saptrhnw05:required>
<saprmnw05:enableWSRM xmlns:saprmnw05="http://www.sap.com/NW05/soap/features/wsrm/">false</saprmnw05:enableWSRM>
</wsp:Policy>
<wsdl:types>
<xsd:schema attributeFormDefault="qualified" targetNamespace="urn:sap-com:document:sap:rfc:functions">
<xsd:simpleType name="char12">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="12"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
<xsd:schema xmlns:n0="urn:sap-com:document:sap:rfc:functions" attributeFormDefault="qualified" targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style">
<xsd:import namespace="urn:sap-com:document:sap:rfc:functions"/>
<xsd:element name="MeGetCurrentUserId">
<xsd:complexType>
<xsd:sequence/>
</xsd:complexType>
</xsd:element>
<xsd:element name="MeGetCurrentUserIdResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Username" type="n0:char12"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="MeGetCurrentUserId">
<wsdl:part name="parameters" element="tns:MeGetCurrentUserId"/>
</wsdl:message>
<wsdl:message name="MeGetCurrentUserIdResponse">
<wsdl:part name="parameter" element="tns:MeGetCurrentUserIdResponse"/>
</wsdl:message>
<wsdl:portType name="zME_GET_CURRENT_USER_ID">
<wsdl:documentation>
<sapdoc:sapdoc xmlns:sapdoc="urn:sap:esi:documentation">
<sapdoc:docitem docURL="http://edr-aioexp.edraky.local:8010/sap/bc/esdt/docu/sd_text?sap-client=200&sd_name=ZME_GET_CURRENT_USER_ID"/>
</sapdoc:sapdoc>
</wsdl:documentation>
<wsp:Policy>
<wsp:PolicyReference URI="#IF_IF_zME_GET_CURRENT_USER_ID"/>
</wsp:Policy>
<wsdl:operation name="MeGetCurrentUserId">
<wsp:Policy>
<wsp:PolicyReference URI="#OP_IF_OP_MeGetCurrentUserId"/>
</wsp:Policy>
<wsdl:input message="tns:MeGetCurrentUserId"/>
<wsdl:output message="tns:MeGetCurrentUserIdResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ZME_GET_CURRENT_USER_ID" type="tns:zME_GET_CURRENT_USER_ID">
<wsp:Policy>
<wsp:PolicyReference URI="#BN_BN_ZME_GET_CURRENT_USER_ID"/>
</wsp:Policy>
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<wsdl:operation name="MeGetCurrentUserId">
<soap:operation soapAction="urn:sap-com:document:sap:soap:functions:mc-style:zME_GET_CURRENT_USER_ID:MeGetCurrentUserIdRequest" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ZME_GET_CURRENT_USER_ID_SOAP12" type="tns:zME_GET_CURRENT_USER_ID">
<wsp:Policy>
<wsp:PolicyReference URI="#BN_BN_ZME_GET_CURRENT_USER_ID_SOAP12"/>
</wsp:Policy>
<wsoap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<wsdl:operation name="MeGetCurrentUserId">
<wsoap12:operation soapAction="urn:sap-com:document:sap:soap:functions:mc-style:zME_GET_CURRENT_USER_ID:MeGetCurrentUserIdRequest" style="document"/>
<wsdl:input>
<wsoap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<wsoap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ZME_GET_CURRENT_USER_ID">
<wsdl:port name="ZME_GET_CURRENT_USER_ID" binding="tns:ZME_GET_CURRENT_USER_ID">
<soap:address location="http://edr-aioexp.edraky.local:8010/sap/bc/srt/rfc/sap/zme_get_current_user_id/200/zme_get_current_user_id/zme_get_current_user_id"/>
</wsdl:port>
<wsdl:port name="ZME_GET_CURRENT_USER_ID_SOAP12" binding="tns:ZME_GET_CURRENT_USER_ID_SOAP12">
<wsoap12:address location="http://edr-aioexp.edraky.local:8010/sap/bc/srt/rfc/sap/zme_get_current_user_id/200/zme_get_current_user_id/zme_get_current_user_id"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

知道我们将 IP edr-aioexp.edraky.local 映射到我在 URL 中使用的真实 IP

谁能帮帮我?

编辑

我没有收到来自 ANDROID 的回复,

此 Web 服务存在于 SAP 系统上。在 SAP 系统上测试时,会出现此响应,但在 android 上我没有收到任何响应。

请求

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Header>
<sapsess:Session xmlns:sapsess="http://www.sap.com/webas/630/soap/features/session/">
<enableSession>true</enableSession>
</sapsess:Session>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:MeGetCurrentUserId xmlns:ns1='urn:sap-com:document:sap:soap:functions:mc-style'>
</ns1:MeGetCurrentUserId>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

回应

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header/>
<soap-env:Body>
<n0:MeGetCurrentUserIdResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style">
<Username>EAB_SAMIR</Username>
</n0:MeGetCurrentUserIdResponse>
</soap-env:Body>
</soap-env:Envelope>

【问题讨论】:

    标签: android xml-parsing wsdl ksoap2 android-ksoap2


    【解决方案1】:

    你有错误

    org.xmlpull.v1.XmlPullParserException: expected: START_TAG
    

    这意味着您可能在以下一项(或多项)中有错误:WSDL_URL、WS_NAMESPACE、WS_METHOD_NAME,。

    试试看:

    WS_NAMESPACE="urn:sap-com:document:sap:soap:functions:mc-style"
    soapAction= "zME_GET_CURRENT_USER_ID"
    

    你仍然得到那个错误吗?

    【讨论】:

    • 亲爱的 shadesco,感谢您的帮助,但我仍然遇到同样的错误 :( 我将尝试 WSDL_URL、WS_NAMESPACE、WS_METHOD_NAME 的所有组合
    • @RanaO​​sama 您添加的编辑,这是来自 requestDump 和 responseDump?或者应该怎么做?
    • 我编辑了 WSDL_URL、WS_NAMESPACE、WS_METHOD_NAME 并显示了请求和响应
    • @RanaO​​sama 所以在更改这些属性之后;现在您不再出现“org.xmlpull.v1.XmlPullParserException: expected: START_TAG”错误了吗?
    • 我知道错误出现在 WSDL_URL, WS_NAMESPACE,WS_METHOD_NAME 这些字段中。 . .但我无法得到它们的正确值
    【解决方案2】:

    此帖XmlPullParserException when using SAP WSDL WebService

    帮我解决了我的问题

    我的问题是 soapActionWSDL_URL

    我使用了 WSDL 文件本身中的 URL,而不是我在浏览器中编写的 URL:找到下面的编写代码

    private static final String soapAction = WS_NAMESPACE + "/" + WS_METHOD_NAME; 
    
    private static final String WSDL_URL = "http://IP:8010/sap/bc/srt/rfc/sap/zme_get_current_user_id3/200/zme_get_current_user_id3/zme_get_current_user_id3?sap-user=******&sap-password=******";
    

    我得到了正确的响应。

    非常感谢大家帮我解决了我的问题

    【讨论】:

      【解决方案3】:
       check this you have to use request.addProperty() for sending parameter
      
      
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
      
      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                              envelope.dotNet = true;
                              envelope.setOutputSoapObject(request);
      
      
      request.addProperty("User Name", MYUSERNAME);
                      request.addProperty("username", MYUSERNAME);
                      request.addProperty("Password", MYPASSWORD);
      
         HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                             androidHttpTransport.call(SOAP_ACTION, envelope);
                              Object resonse=envelope.getResponse();
                            String output = resonse.toString();
      

      【讨论】:

      • 亲爱的 Pavan,在我的代码中,我已经在使用 request.addProperty 发送用户名和密码,这不是我的问题
      • @RanaO​​sama,我遇到了和你类似的问题,你能帮帮我吗?
      • @rodrigo.oliveira 你到底有什么问题?
      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多