Я пытаюсь разобрать файл XML, который я извлечь из следующего URL с помощью запроса Http в Android:Лучший способ Разбираем этот XML-файл
http://www.musicbrainz.org/ws/2/recording/?query=kick%20AND%20artist:inxs
Что бы быть лучшим способом, чтобы разобрать его ? Мне нужно найти имя исполнителя, название альбома и идентификатор релиза. Я пытался использовать метод, указанный здесь:
http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
Но оно оказывается действительно ineffecient. Любое предложение для библиотеки или более простой метод, который я могу использовать для получения необходимой информации?
Мой код до сих пор выглядит следующим образом:
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 парсера Учебник в Android, но я хочу, чтобы избежать писать так много кода каждого узла и В XML-файле их много. Я думаю, что я бы предпочел использовать XML Pull Parser для DOM, чтобы я не потреблял много памяти.
Либо SAX или DOM, оба из которых [хорошо поддерживаются в Java] (http://www.mkyong.com/tutorials/java-xml-tutorials/), являются моими механизмами синтаксического анализа. Никогда не использовал разбор пар, но я уверен, что это эквивалентно. – hd1
Покажите нам свой код, и мы можем помочь сделать его более эффективным. –
Добавлен код. – Rohaan