尝试从 android 应用中的 RSS 提要中提取并播放 mp3 文件

Trying to pull and play an mp3 file from RSS feed in android app

我正在尝试为播客制作一个应用程序。我的最终目标是让用户能够单击列表中的剧集(从 RSS 提要生成)然后播放音频(也是从 RSS 提要中检索的)我的问题是解析 XML 来自 RSS 提要。我似乎无法弄清楚如何从 mp3 的附件标签中取出 URL。任何帮助,将不胜感激。这是我的解析 class

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>

所以您想要 url 在附件 url= 标记之后?

如果是这样就很容易了。只需使用子字符串查找并获取 url.

像这样的东西应该有用。

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

试试这个:

...
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
...
}

这个问题的解决方案非常简单。我需要做的就是删除

urlValue = xpp.getText();

来自

case XmlPullParser.TEXT:

然后改变

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

case XmlPullParser.END_TAG: