4

明確な質問かどうかはわかりません。Web サービスから xml 応答を取得する必要があります。Web サービスの URL、ユーザー名、パスワード、xml 本文などの詳細があります。また、xml 応答を文字列で取得できます。変数.xml文字列を解析するための便利なリンクを教えてもらえますか? xmlを取得するためのコードを共有しています注:-commons-httpclient-3.1、commons-codec-1.6、commons-logging-1.1.1、junit-4.10ライブラリがあることを確認してください

 import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpStatus;
    import org.apache.commons.httpclient.UsernamePasswordCredentials;
    import org.apache.commons.httpclient.auth.AuthScope;
    import org.apache.commons.httpclient.methods.PostMethod;


    public class AbstractService
    {
        @SuppressWarnings( "deprecation" )
        protected String postForString( final String requestUrl, final String requestBody )
        {
            final StringBuilder result = new StringBuilder();
            HttpClient client = new HttpClient();

            try
            {
                PostMethod postRequest = new PostMethod( getAbsoluteUrl( requestUrl ) );

                postRequest.addRequestHeader( WebServiceClientConstants.CONTENT_TYPE,
                        WebServiceClientConstants.APPLICATION_XML );
                postRequest.setRequestBody( WebServiceClientConstants.REQUEST_HEADER + requestBody );

                client.getState()
                        .setCredentials(
                                new AuthScope( WebServiceClientConstants.HOST, WebServiceClientConstants.PORT,
                                        AuthScope.ANY_REALM ),
                                new UsernamePasswordCredentials( WebServiceClientConstants.USERNAME,
                                        WebServiceClientConstants.PASSWORD ) );

                int responseCode = client.executeMethod( postRequest );

                System.out.println( "[REQUEST][" + postRequest.getURI().toString() + "]" );
                System.out.println( "[STATUS][" + postRequest.getStatusLine().toString() + "]" );

                if ( HttpStatus.SC_OK == responseCode )
                {
                    String data = null;
                    final InputStream responseStream = postRequest.getResponseBodyAsStream();
                    final BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( responseStream,
                            WebServiceClientConstants.UTF_8_ENCODING ) );

                    while ( ( data = bufferedReader.readLine() ) != null )
                    {
                        result.append( data );
                    }
                }

                postRequest.releaseConnection();

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

            return result.toString();
        }

        private String getAbsoluteUrl( String requestUrl )
        {
            return WebServiceClientConstants.SERVIE_BASE_URL + requestUrl;
        }
    }

WebServiceClientConstants インターフェイス

package com.test.service.info;
public interface WebServiceClientConstants
{
    String  PROTOCOL        = "http://";
    String  HOST            = "youraddress.blah.test.com";
    Integer PORT            = 8080;
    String  SERVIE_BASE_URL = "http://youraddress.blah.test.com:8080/test/seam/resource/Services/";
    String  USERNAME        = "Username";
    String  PASSWORD        = "password";
    String  REQUEST_HEADER  = "<?xml version=\"1.0\"?>";
    String  CONTENT_TYPE    = "Content-Type";
    String  APPLICATION_XML = "application/xml";
    String  UTF_8_ENCODING  = "UTF-8";
}

MenuService インターフェイス

public interface MenuService
{
    String getMenu();
}

MenuServiceImpl.java

public class MenuServiceImpl extends AbstractService implements MenuService
{
    @Override
    public String getMenu()
    {
        String requestUrl = "getMenu";
        String requestBody = "<ServiceRequest>" + "<ShortName>AppName</ShortName>"
                + "</ServiceRequest>";

        return postForString( requestUrl, requestBody );
    }
}

次に、いくつかのアクティビティで書き込みます

 MenuService menuService = new MenuServiceImpl();
        String prMenu = menuService.getMenu();
        Assert.assertNotNull( prMenu );

        test.setText(prMenu);

これで、xml 応答が prMenu 変数に格納されました。これは http://www.coders-global.com/works/dev/menuserivicetemp.xmlのようになります。この Xml 文字列を解析するにはどうすればよいですか。リンクを見てください。複雑に見えます。以前に他のスレッドでこのリンクを解析する方法を尋ねたことがありますが、返信はそれほど役に立ちませんでした。有用なリンクや提案があれば教えてください。

4

1 に答える 1

0

あなたの質問は、リモートサーバーからデータを正しく取得できるように見えるため、「メモリに保存されている XML コンテンツを解析するにはどうすればよいですか」に相当するようです。

基本的に、Java ライブラリに組み込まれているこのための 2 つのツールがあり、それぞれ SAX パーサーと DOM パーサーと呼ばれます。これら 2 つのオプションはまったく異なる働きをするため、違いを理解し、賢く選択することが重要です。

これは、android XML Parsing TutorialでDOM パーサーを使用する例です。これは、データ量が少ないことを考えると、おそらくあなたが取りたい方向です。

PS: String.append を使用することも、パフォーマンスの観点からはかなり悪いです。この種のタスク用に最適化された stringbuilder クラスを確認する必要があります。

于 2012-09-03T12:16:22.903 に答える