0

検索の最初の結果を取得しようとしています。検索で xml ファイルが返され、その xml を sax パーサーで処理しています。実際、xml ファイルを解析して、その検索の最初の結果を処理した時点で停止したいと考えています。

つまり、次のファイルを解析したいと思います: http://musicbrainz.org/ws/2/release?query=barcode:606949062927最初の結果 (エミネムのアルバム) を取得します。しかし、コードを使用しているときは、最後の結果 (Daniel Swain のアルバム) を保存しますが、これは望ましくありません。したがって、最初の結果の後で解析を停止できれば、これははるかに優れています (時間がかかりません)。

これは boolean を設定することで可能だと思いますfirstResult。最初の結果の処理が終わったら true に設定しますが、本当に汚いと思います。それを行う別の方法があると思いますか?

ここに私のコードの一部があります:

public DataMusic parseBarcode(InputStream is) {

    final DataMusic resultAlbum = new DataMusic();

    RootElement root = new RootElement(ATOM_NAMESPACE,"metadata");
    Element releaseList=root.getChild(ATOM_NAMESPACE,"release-list");
    Element release = releaseList.getChild(ATOM_NAMESPACE,"release");
    Element title = release.getChild(ATOM_NAMESPACE,"title");
    Element artistCredit = release.getChild(ATOM_NAMESPACE,"artist-credit");
    Element nameCredit = artistCredit.getChild(ATOM_NAMESPACE,"name-credit");
    Element artist = nameCredit.getChild(ATOM_NAMESPACE,"artist");
    Element artistName = artist.getChild(ATOM_NAMESPACE, "name");
    releaseList.setStartElementListener(new StartElementListener() {
        @Override
        public void start(Attributes attributes) {
            if(attributes.getValue("count").equals(null) || attributes.getValue("count").equals("") || attributes.getValue("count").equals("0")) {
                resultAlbum.setMBId(null);
                resultAlbum.setAlbumName(null);
                resultAlbum.setArtistName(null);
                Log.w(TAG_MB, "Album was not found on MB. count=" + attributes.getValue("count") +".");
            }

        }
    });
    release.setStartElementListener(new StartElementListener() {
        @Override
        public void start(Attributes attributes) {
            resultAlbum.setMBId(attributes.getValue("id"));
            Log.v(TAG_MB, "Album found with id=" + attributes.getValue("id"));
        }

    });
    title.setEndTextElementListener(new EndTextElementListener() {
        @Override
        public void end(String body) {
            Log.v(TAG_MB, "Album name set to " + body);
            resultAlbum.setAlbumName(body);
        }

    });
    artistName.setEndTextElementListener(new EndTextElementListener() {
        @Override
        public void end(String body) {
            Log.v(TAG_MB, "Album artist name set to " + body);
            resultAlbum.setArtistName(body);
        }           
    });
    try {
        Log.v(TAG_MB, "Starting parsing data...");
        Xml.parse(is, Xml.Encoding.UTF_8, root.getContentHandler());
        Log.v(TAG_MB, "Finished parsing. Returning album with MBID=" + resultAlbum.getMBId() + " and name=" + resultAlbum.getAlbumName()) ;
        return resultAlbum; 
    } catch (SAXException e) {
        Log.e(TAG_MB + "_SAXException", "SAXException with MusicBrainz");
        Log.e(LOGCAT_TAG + "_SAXException",e.getMessage());
    } catch (IOException e) {
        Log.w(TAG_MB+ "_IOException", "The HTTP Request wasn't good. Either 403 error, or the album wasn't found on LASTFM");
        Log.w(LOGCAT_TAG+ "_IOException", "" + e.getMessage(), e);
    }
    return null;

}

4

1 に答える 1

0

ブール値を持つよりも良い唯一のことは、オブジェクトfirstResultの単一のインスタンスを持つことだと思いDataMusicます。関数の一番上で、アプリケーション全体の単一インスタンスDataMusicオブジェクトの null チェックを行うことができます。見つかったnull場合は、XML の解析が初めて行われていることを確認でき、オブジェクトの値を初期化および設定できます。次回、 の単一インスタンス オブジェクトが null ではないことを確認したときにDataMusic、XML が解析され、値が設定されたと結論付けることができます。

この説明がお役に立てば幸いです。

于 2012-06-21T17:51:03.540 に答える