2016-08-06 9 views
0

Я пытаюсь сделать приложение для подкаста. Моя конечная цель заключается в том, чтобы пользователь мог нажать на эпизод в списке (который генерируется из RSS-канала), а затем воспроизвести аудио (который также извлекается из RSS-канала). Моя проблема заключается в разборе XML из RSS-канала. Я не могу понять, как получить URL-адрес из тега приложения для mp3. Любая помощь будет оценена по достоинству. Вот мой синтаксический классПопытка вытащить и воспроизвести mp3-файл из RSS-канала в приложении Android

private String data; 
private ArrayList<Episodes> mEpisodes; 

public ParseEpisodes(String xmlData) { 
    this.data = xmlData; 
    mEpisodes = new ArrayList<>(); 
} 

public ArrayList<Episodes> getEpisodes() { 
    return mEpisodes; 
} 

public boolean process(){ 
    boolean status = true; 
    Episodes currentRecord = null; 
    boolean inEntry = false; 
    String textValue = ""; 
    String urlValue = ""; 

    try{ 
     XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     XmlPullParser xpp = factory.newPullParser(); 
     xpp.setInput(new StringReader(this.data)); 
     int eventType = xpp.getEventType(); 

     while(eventType != XmlPullParser.END_DOCUMENT){ 
      String tagName = xpp.getName(); 
      switch(eventType){ 
       case XmlPullParser.START_TAG: 
        //Log.d("ParseEpisodes", "Starting tag for " + tagName); 
        if(tagName.equalsIgnoreCase("item")){ 
         inEntry = true; 
         currentRecord = new Episodes(); 
        } 
        break; 

       case XmlPullParser.TEXT: 
        textValue = xpp.getText(); 
        urlValue = xpp.getText(); 
        break; 


       case XmlPullParser.END_TAG: 
        //Log.d("ParseEpisodes", "Ending tag for " + tagName); 
        if(inEntry){ 
         if(tagName.equalsIgnoreCase("item")){ 
          mEpisodes.add(currentRecord); 
          inEntry = false; 
         }else if(tagName.equalsIgnoreCase("title")){ 
          currentRecord.setTitle(textValue); 
         }else if(tagName.equalsIgnoreCase("enclosure")){ 
          currentRecord.setLink(urlValue); 
         } 

        } 
        break; 
      } 
      eventType = xpp.next(); 
     } 

    }catch (Exception e){ 
     status = false; 
     e.printStackTrace(); 
    } 


    return true; 

} 

здесь является XML

<item> 
    <title>Episode 52 - Facebook Nukes The Show</title> 
    <link>https://greynoi.se/podcasts/episode-52-facebook-nukes-the-show</link>  
    <enclosure url="http://greynoi.se/episodes/ep79_m.mp3" length="43312404" type="audio/mpeg"/> 
    <pubDate>Fri, 15 Jul 2016 15:22:24 -0700</pubDate> 
    <category>1</category> 
    <source url="https://greynoi.se">The GR3YNOISE Podcast</source> 
    <itunes:subtitle>Episode 52 - Facebook Nukes The Show</itunes:subtitle> 
    <itunes:summary>Episode 52 - Facebook Nukes The Show</itunes:summary> 
    <content:encoded><![CDATA[Episode 52 - Facebook Nukes The Show"}]]></content:encoded> 
    <guid>https://greynoi.se/podcasts/episode-52-facebook-nukes-the-show</guid> 
</item> 

ответ

0

Решение это закончилось тем, что было довольно просто. Все, что мне нужно сделать, удалить

urlValue = xpp.getText(); 

из

case XmlPullParser.TEXT: 

Затем измените

else if(tagName.equalsIgnoreCase("enclosure")){ 
     urlValue = xpp.getAttributeValue(0); 
     currentRecord.setLink(urlValue); 
} 

в

case XmlPullParser.END_TAG: 
0

Так что вы хотите URL после шкафа URL = тега?

Если это так, то это очень просто. Просто используйте подстроки, чтобы найти и получить URL.

Что-то вроде этого должно работать.

 int urlTagStart = text.indexOf("<enclosure url=""); 
     int urlTagEnd = text.indexOf(".mp3"); 
     String url = text.substring(urlTagStart + 16, urlTagEnd + 4) 
+0

Спасибо Джареду, я ценю ответ, однако, У меня возникли проблемы с реализацией Gestion. Возможно, я просто не понимаю. Не могли бы вы мне помочь и немного подробнее? – Mycah

+0

Все, что вам нужно, это найти начало и конец URL-адреса и получить все, что находится между ними. – Jared

0

Попробуйте это:

... 
YOUR CODE 
... 

while(eventType != XmlPullParser.END_DOCUMENT){ 
    String tagName = xpp.getName(); 
    if (tagName.equalsIgnoreCase("enclosure")) { 
     int attributeCount = xpp.getAttributeCount(); 
     for(int i = 0; i<attributeCount; i++){ 
      String attrib = xpp.getAttributeName(i); 
      if(attrib && attrib.equalsIgnoreCase("url")){  
       String url = xpp.getAttributeValue(i); 
      } 
     } 
    } 
    if (url != null && !url.isEmpty() && !url.equals("null")) { 
     Log.d("ParseEpisodes", "URL to mp3: " + url); 
    } 

... 
THE REST OF YOUR CODE 
... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^