1

これまでのところ、Web サービスに接続して SoapObject 応答を取得することができましたが、適切でクリーンな解析方法を絞り込むのに苦労しています。インターネットを検索しても実際には多くの結果が得られませんでした。誰もが異なる方法と異なるプロセスを持っており、通常は独自の Web サービスを対象としており、1 回限りの使用タイプのソリューションになっています。基本的に、以下はWebサービスから得た応答です

anyType{
 schema=anyType{
  element=anyType{
   complexType=anyType{
    choice=anyType{
     element=anyType{
      complexType=anyType{
       sequence=anyType{
        element=anyType{}; 
           element=anyType{}; 
            element=anyType{}; 
              element=anyType{}; }; }; }; }; }; }; };   
      diffgram=anyType{
         NewDataSet=anyType{
          Rep_x0020_Information=anyType{
            Login=CorrectLogin; Password=InCorrectPass; }; }; }; }

基本的に、2 つの重要なフィールド (ログインとパスワード) だけを解析できるようにしたいと考えています。私が読んだことから、プロパティ数に基づいて SoapObject 応答を反復しようとしましたが、うまくいかないようです。試してみると、応答のプロパティ数が 2 になったので、代わりに以下のようなことをしました。

SoapObject response=(SoapObject) envelope.getResponse();

                if  (response != null) {
                    Log.i("Message", "the response contains: " + response.toString());
                    SoapObject diffgram = (SoapObject) response.getProperty("diffgram");
                    SoapObject NewDataSet = (SoapObject) diffgram.getProperty("NewDataSet");
                    SoapObject RepInfo = (SoapObject) NewDataSet.getProperty("Rep_x0020_Information");
                    for (int i = 0; i < RepInfo.getPropertyCount(); i++) {
                        PropertyInfo info = new PropertyInfo();
                        RepInfo.getPropertyInfo(i, info);
                        Log.d("Info", info.name + " : " + RepInfo.getProperty(i).toString());
                    }


 //which gives the following message in LogCat
  D/Info(716): Login : InCorrectLogin
  D/Info(716): Password : InCorrectPass

最後のループまでに、必要な 2 つのオブジェクトを取得するため、このプロセスは機能しますが、これを行うためのよりクリーンな方法があるように感じます。私が尋ねるのは、このアプリにさらに入ると、より複雑な Web サービス呼び出しが行われるため、取得するためだけにリクエストごとにいくつかの SoapObjects を構築するのではなく、アプリ全体で再利用可能なものを持ちたいからです。欲しい物まで。

4

2 に答える 2

2

Web サービスからオブジェクトを解析するには 2 つの方法があります。
まず、あなたが Web サービスの所有者または作成者であると仮定すると、Web サービスに Json 文字列を返させることができます。次に、クライアントから、Json へのエンティティ マップを作成できます。Json ライブラリは、解析に気をつけてください。

2 番目: 通常、Web サービスは多くの複雑なオブジェクトに応答するため、これらのオブジェクトにマップするエンティティを作成できます。このチュートリアル
に従って、単純なオブジェクトをマップする方法を理解してから、この質問からの私の回答に移動して、複雑なオブジェクトの解析を知ることができます。 それはちょうどこのようなものです:

 HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVER_URL);
 androidHttpTransport.call(SOAP_ACTION, envelope);// call
 Entity entity = (Entity)envelope.bodyIn;
于 2012-11-01T08:18:50.553 に答える
0

HttpTransportSE でデバッグ プロパティを設定し、呼び出しの直後に requestDump および/または responseDump を取得することで、より簡単な方法で応答 (および要求) xml を取得できます。このようなもの:

HttpTransportSE  httpTransport = new HttpTransportSE(wsURL);
httpTransport.debug = true;

httpTransport.call("WS_NAMESPACE" + methodName, envelope);

Log.w("RawXML Request:" + httpTransport.requestDump);
Log.w("RawXML Response:" + httpTransport.responseDump);

ソープ障害を分析するために、try catch ブロックでも使用できます。

パフォーマンスが低下するため、使用後にデバッグを無効にすることを忘れないでください。その場合、これらの Dump プロパティは null になります。

于 2012-11-01T18:17:10.210 に答える