2017-12-11 2 views
0

私はKSOAP2を使用してSOAP Webサービスから応答を取得しようとしていますが、XMLファイルが入っている文字列があれば誰でもどのように解析できますか?SOAPから別の内部に配列を持つ複雑な応答をアンドロイドで構文解析する

SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 

     SoapSerializationEnvelope soapEnvelope = new write(SoapEnvelope.VER11); 
     soapEnvelope.dotNet = true; 
     soapEnvelope.setOutputSoapObject(Request); 

     transport = new HttpTransportSE(URL); 
     transport.debug=true; 

     transport.call(SOAP_ACTION, soapEnvelope); 
     response = (SoapObject) soapEnvelope.bodyIn; 

そして、これは私が得る応答である:

Response{ 
    Result= <raiz> 
       <result> 
       <exitoso>val</exitoso> 
        <message>message</message> 
       </result> 
       <clients> 
       <client> 
        <id>id</id> 
        <name>name</name> 
        <lastname>lastname</lastname> 
       </client> 
       </clients> 
      </raiz>; 
} 

誰もが、私は、実際のデータを得ることができる方法を知っているが、ここで

は、私が使用しているコードのですか?名前、ID、姓のように?

+0

あなたは何を得るのですか役立つことを願ってしまったソリューションですか? [SOAPオブジェクト> getProperty](http://kobjects.org/ksoap2/doc/api/org/ksoap2/serialization/SoapObject.html#getProperty(java.lang.String)) – veggirice

+0

@veggirice \t もし私が移動しようとすると応答私は ' ヴァル メッセージ IDでのみ "レスポンス" プロパティを取得します また、私のプロパティカウントは1を返すだけです –

+0

質問のいくつか: 1.あなたの応答変数のタイプは何ですか?それはSoapObjectですか? 2.そうであれば、response.getProperty( "name")。toString()を実行するとどうなりますか? – veggirice

答えて

0

これは私にはあまりにも多くの時間がかかっていて、実際に私のために働いた他の方法は見つからなかったので、ここでは私がしたことがあります。

私はこのような文字列としてXML文書にCDATAを返すWebサービスを呼び出すすべての最初:

<![CDATA[<users> 
    <user> 
     <username>myusername</username> 
     <password>myPassword</password> 
    </user> 
</users>]]> 

私はクラスのユーザー作成した応答を取得したら:

public class user 
{ 
    public String userName, password; 
} 

そして私、私はちょうどarrayliを取得するための関数を呼び出すクラスGET_VALUES

public class get_values { 

public static Document doc; 
//--- Returns an ArrayList with the values of the User using the User Class 
public static ArrayList<user> UserParser(SoapObject response) 
     { 
      XmlPullParserFactory parserFactory; 
      try{ 
       parserFactory = XmlPullParserFactory.newInstance(); 
       XmlPullParser parser = parserFactory.newPullParser(); 
       ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
       Source xmlSource = new DOMSource(GetDocFromString(response.getProperty(0).toString())); 
       Result outputTarget = new StreamResult(outputStream); 
       TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget); 
       InputStream is = new ByteArrayInputStream(outputStream.toByteArray()); 
       parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
       parser.setInput(is, null); 

       return UserProcessParser(parser); 

      } catch (XmlPullParserException e) { 

      } catch (IOException e) { 
      } catch (TransformerConfigurationException e) { 
      } catch (TransformerException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 


     //--- Creates an xml document using the web service's response 
     private static Document GetDocFromString(String xmlStr) 
     { 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder; 
      try 
      { 
       builder = factory.newDocumentBuilder(); 
       doc = builder.parse(new InputSource(new StringReader(xmlStr))); 
       return doc; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     //--- Returns the xml values as an ArrayList 
     private static ArrayList<user> UserProcessParser(XmlPullParser parser) throws XmlPullParserException, IOException 
     { 
      ArrayList<user> user_data = new ArrayList<>(); 
      int eventType = parser.getEventType(); 
      user_data user_returned = null; 

      while (eventType != XmlPullParser.END_DOCUMENT){ 
       String elementName = null; 
       switch (eventType){ 
        case XmlPullParser.START_TAG: 
         elementName = parser.getName(); 
         if ("user".equals(elementName)) 
         { 
          user_returned = new user_data(); 
          user_data.add(user_returned); 
         } 
         else if (user_returned != null) 
         { 
          if ("username".equals(elementName)) 
          { 
           user_returned.username = parser.nextText(); 
          } 
          else if ("password".equals(elementName)) 
          { 
           user_returned.password = parser.nextText(); 
          } 
         } 
         break; 
       } 
       eventType = parser.next(); 
      } 

      return user; 
     } 

    } 

を持っていますすべての値を持つST:

ArrayList<user> user_data = get_values.UserParser(MY_WEBSERVICE_RESPONSE); 

そして私は私が必要とするすべての値を取得するには、その後、私は、別のパーサ機能と別のプロセスパーサ機能を追加し、他のWebサービスのためにそれを必要とする場合には、それはあなたのnullを返した場合ただ応答を確認する必要があります。

まあそれは私が、私はそれはあなたがあなたの応答を横断して、属性のプロパティ値を取得するときに誰が

0

あなたはこの試みることができます:

SoapObject rootNode = response.getProperty("Result"); 
for (int i=0; i<= rootNode.getPropertyCount(); i++) { 
    SoapObject so = rootNode.getProperty(i); 
    String name = so.getProperty("name").toString(); 
    //print name to log/console 
} 

は文書で行ってきました。キャストや依存関係を解決する必要があるかもしれません。あなたはその名前のために何を得ますか?

+0

:XMLデータを返すresponse.getProperty( "結果")することができます%確実な応答はSoapObject型であり、次に設定します: 'SoapObject response =(SoapObject)soapEnvelope.bodyIn; '上記のスニペット – veggirice

+0

@veggierice 私はそれを試みたが、私は次のエラーを受け取りました: ' org.ksoap2.serialization.SoapPrimitiveはorg.ksoap2.serialization.SoapObject'にキャストできません明らかに 私はSoapPrimitiveレスポンスを扱っていますか? –

+0

この[リンク](https://stackoverflow.com/questions/16583796/when-to-use-soapobject-and-soapprimitive)を見て、おそらくSoapPrimitiveの代わりに封筒からあなたの応答にSoapObjectを使用しようとします – veggirice

関連する問題