2014-01-12 1 views
0

Я пытаюсь разобрать файл 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, чтобы я не потреблял много памяти.

+0

Либо SAX или DOM, оба из которых [хорошо поддерживаются в Java] (http://www.mkyong.com/tutorials/java-xml-tutorials/), являются моими механизмами синтаксического анализа. Никогда не использовал разбор пар, но я уверен, что это эквивалентно. – hd1

+0

Покажите нам свой код, и мы можем помочь сделать его более эффективным. –

+0

Добавлен код. – Rohaan

ответ

0

Documentation of the MusicBrainz Web Service упоминает библиотеку java, которая может быть использована: musicbrainzws2-java.

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

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


wiki of the library имеет несколько примеров о том, как использовать его для поиска.