2016-08-17 3 views
1

私はAndroid StudioでSOAPを使ってプロジェクトを進めています。私はSOAPを初めて使い、いくつかの記事を研究しました。私はSOAPを解決しようとしていますが、私は何かに固執しています。 XML構造があり、このXMLタグからデータを取得できません。実際には私は "tem:..."で始まるタグについては考えていません。SOAPからデータを呼び出すには?

SOAP XML Tag

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:GetForexStocksandIndexesInfo> 
     <tem:request> 
      <tem:IsIPAD>true</tem:IsIPAD> 
      <tem:DeviceID>test</tem:DeviceID> 
      <tem:DeviceType>ipad</tem:DeviceType> 
      <tem:RequestKey>%%UmVxdWVzdElzVmFsaWQxNjowNToyMDEyIDExOjU0%%</tem:RequestKey> 
     <tem:Period>Day</tem:Period> 
     </tem:request> 
     </tem:GetForexStocksandIndexesInfo> 
    </soapenv:Body> 
</soapenv:Envelope> 

And my Class to consume data

public void CallWebService() { 
     final Date date = new Date(); 
     final String getCurrentDate = new SimpleDateFormat("dd:MM:yyyy HH:mm", Locale.ROOT).format(date); 

     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       key = encryptManager.PushData("RequestIsValid" + getCurrentDate); 
       Log.i("Key: ", key); 

       key2 = sharesandIndexesListManager.PushData2("true","test","ipad",key,"Day"); 
       Log.i("Key2: ", key2); 
      } 
     }); 

thread.start()。 }

ウェブの変数に変数のタイプが表示されますが、変数のタイプが表示されません(例:web:urlのDeviceType)。さらに、Key2はnullを返します。私を助けてください:)ありがとう。

とエラー:org.xmlpull.v1.XmlPullParserException:予期しないタイプ(位置:END_DOCUMENTヌル@ 1:[email protected] 1)

+1

https://github.com/joaocruz04/JSoap – Sharj

+0

などのSOAPライブラリを使用します。したがって、タグのタイプはわかりません(例:tem:deviceID)。文字列か整数か? – nuhkoca

+0

@nuhkocaあなたは答えを見つけましたか?私は同じ割り当てを持って:)、kSOAPを使ってプロパティを追加する正しい方法を見つけることができません。 – Thracian

答えて

0

私は構文解析のためのksoap2-のAndroidライブラリを使用することをお勧めします。値の型がわからない場合は、取得するSoapObjectでgetPropertyAsStringを使用してください。

これを試してください: SoapObject messageObject =(SoapObject)response.getProperty( "request");

//最後からフェッチする対象 文字列lastAsString = messageObject.getPropertyAsString( "DeviceID");

ここ http://kobjects.org/ksoap2/doc/api/

ルックSoapObject方法、それが助けなら、私に教えてください。

UPD

public class DeviceDetail implements KvmSerializable { 

    public String IsIPAD = null; 
    public String DeviceID= null; 
    //TODO: ADD MORE VALUES YOURSELF! LIKE DeviceType 

    private final String DATA_NAMESPACE = "http://schemas. YOUR SCHEMA HERE"; 

    public DeviceDetail() { 
    } 

    @Override 
    public Object getProperty(int arg0) { 

     switch (arg0) { 
     case 0: 
      return this.IsIPAD; 
     case 1: 
      return this.DeviceID; 
     } 

     return null; 
    } 

    @Override 
    public int getPropertyCount() { 

    //TODO: change to number of items accordingly 
     return 2; 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { 

     arg2.namespace = DATA_NAMESPACE; 

     switch (arg0) { 
     case 0: 
      arg2.type = PropertyInfo.STRING_CLASS; 
      arg2.name = "IsIPAD"; 
      break; 
     case 1: 
      arg2.type = PropertyInfo.STRING_CLASS; 
      arg2.name = "DeviceID"; 
      break; 
     default: 
      break; 
     } 

    } 

    @Override 
    public void setProperty(int arg0, Object arg1) { 

     switch (arg0) { 
     case 0: 
      this.IsIPAD= arg1.toString(); 
      break; 
     case 1: 
      this.DeviceID= arg1.toString(); 
      break; 
     default: 
      break; 
     } 

    } 

    } 

まず、あなたのニーズに基づいて、サーバー上の要求を作成します。

//TODO: change to appropriate values 
String METHOD_NAME = "MyMethod"; 
String INTERFACE = "IMyInterface"; 
String NAMESPACE = "http://tempuri.org/"; 
String SOAP_ACTION = NAMESPACE + INTERFACE + "/" + METHOD_NAME; 

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
request.addProperty("APIKey", API_KEY); 
request.addProperty("AuthToken", AuthToken); 
request.addProperty("UserID", 1); 

SoapSerializationEnvelope envelope = 
    new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true; 
       envelope.setOutputSoapObject(request); 

次にあなたが呼び出しを実行して、石鹸のデータを解析することができます

HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVER_URL); 
    androidHttpTransport.call(SOAP_ACTION, envelope);// call 
    DeviceDetail responseObject = (DeviceDetail)envelope.bodyIn; 
    //TODO: in responseObject now your data. 
    String ssIPAD = responseObject.IsIPAD ; 

ここでは、ksoap turorialといくつかの説明があります: http://seesharpgears.blogspot.com/2010/10/ksoap-android-web-service-tutorial-with.html

+0

まずは、ありがとう。私はあなたのコードを試みますが、あなたのコードは型を返さないので、値を返します。というのは。私はそれがbooelan、stringまたは...であることを知りたいと思います。そして、これはネストされた石鹸だと思います。どうすればtemID:deviceIDまたは他のものにアクセスできますか? – nuhkoca

+0

@nuh-koca私は、ksoap2ライブラリを使って複雑な応答を解析する例を見つけました。 KvmSerializableクラスを使用すると、ネストされたオブジェクトで作業し、名前空間内の名前にアクセスできます。 http://stackoverflow.com/questions/16602566/how-to-parse-complex-response-with-use-of-ksoap2-library- in-android 値のタイプがわからない場合は、文字列として指定し、後でLongを使用して値を変換するだけです。たとえば、getLong(value)。 – zkvarz

+0

ありがとうございましたあなたの投稿を見ましたが、今は非常に混乱しています。☺SOAP XML構造でコードクラスを構築する方法を教えてください。 – nuhkoca

関連する問題