Лучший способ разобрать этот файл XML

Я пытаюсь проанализировать XML-файл, который я получаю по следующему URL-адресу, используя Http-запрос в Android:

http://www.musicbrainz.org/ws/2/recording/?query=kick%20AND%20artist:inxs

Что было бы лучшим способом разобрать его? Мне нужно найти имя исполнителя, название альбома и идентификатор релиза. Я пытался использовать метод, указанный здесь:

http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

Но это оказалось действительно неэффективно. Любое предложение для библиотеки или более простого метода, который я могу использовать для получения необходимой информации?

Мой код пока выглядит следующим образом:

public List parse(InputStream in) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        parser.nextTag();
        return readFeed(parser);
    } finally {
        in.close();
    }
}

private List readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
    List entries = new ArrayList();

    parser.require(XmlPullParser.START_TAG, ns, "metadata");
    Log.i("XMLParser", "metadata");
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        // Starts by looking for the entry tag
        if (name.equals("recording-list")) {
            Log.i("XMLParser", "recording-list");
            entries.add(readRecordingList(parser));
        } else {
            skip(parser);
        }
    }  
    return entries;
}

private Recording readRecordingList(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, ns, "recording-list");
    Recording recording=new Recording(null,null,null,null);

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        if (name.equals("recording")) {
            Log.i("XMLParser", "recording");
            recording = readRecording(parser);
        } else {
            skip(parser);
        }
    }
    return recording;
}

private Recording readRecording(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, ns, "recording");
    Recording recording=new Recording(null,null,null,null);
    String albumTitle=null;
    String artistName=null;

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        Log.i("XMLParserNodeName", name);
        if (name.equals("title")) {
            Log.i("XMLParser", "title");
            albumTitle=readTitle(parser);
            Log.i("XMLParser", albumTitle);
            //recording = readRecording(parser);
        }else if(name.equals("name")){ 
            Log.i("XMLParser", "name");
            name=readArtistName(parser);
            Log.i("XMLParser", name);
        }else {
            skip(parser);
        }
    }
    return recording;
}


private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
    if (parser.getEventType() != XmlPullParser.START_TAG) {
        throw new IllegalStateException();
    }
    int depth = 1;
    while (depth != 0) {
        switch (parser.next()) {
        case XmlPullParser.END_TAG:
            depth--;
            break;
        case XmlPullParser.START_TAG:
            depth++;
            break;
        }
    }
 }

private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
    String result = "";
    if (parser.next() == XmlPullParser.TEXT) {
        result = parser.getText();
        parser.nextTag();
    }
    return result;
}

private String readTitle(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "title");
    String title = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "title");
    return title;
}

private String readArtistName(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "name");
    String name = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "name");
    return name;
}

public static class Recording {


        public final String recordingTitle;
        public final String releaseTitle;
        public final String releaseID;
        public final String artistName;

        public Recording(String recordingTitle, String releaseTitle,
                String releaseID, String artistName) {
            this.recordingTitle = recordingTitle;
            this.releaseTitle = releaseTitle;
            this.releaseID = releaseID;
            this.artistName = artistName;
        }    
}

}

По сути, это адаптация учебника XML Pull Parser Tutorial для Android, но я не хочу писать так много кода для каждого узла, а в xml-файле их много. Я думаю, что предпочел бы XML Pull Parser, а не DOM, чтобы не потреблять много памяти.


person Rohaan    schedule 12.01.2014    source источник
comment
Либо SAX, либо DOM, оба из которых хорошо поддерживаются в Java, мои механизмы разбора XML. Никогда не использовал синтаксический анализ по запросу, но я уверен, что это эквивалентно.   -  person hd1    schedule 13.01.2014
comment
Покажите нам свой код, и мы, возможно, сможем помочь сделать его более эффективным.   -  person Don Roby    schedule 13.01.2014


Ответы (1)


В Документация веб-службы MusicBrainz упоминается библиотека Java, которую можно использовать: musicbrainzws2-java.

У меня нет опыта работы с этой конкретной библиотекой, но эти библиотеки, как правило, предоставляют API для прозрачного запроса объектов из MusicBrainz. Выбор правильной конечной точки и анализ выполняется библиотекой.

Вы не первый, кто пытается использовать веб-сервис MusicBrainz с Java ;-)


В вики библиотеки есть несколько примеров ее использования. искать.

person JonnyJD    schedule 14.01.2014