我正在尝试编写一个带有RSS提要和XML的XML解析器。获取<media:thumbnail>
标记的url属性中显示的图片网址。这一切都是通过android.Util.Xml
和&amp;是the code shown here的改编。我尝试使用的示例RSS提要是BBC News RSS feed。
然而,媒体是一个额外的名称空间&amp; (可能)因此我的解析器不能正常工作。
我的解析方法的一个版本如下。有没有(毫无疑问是简单的)方法让我的图片网址列表有效?
public List<string> parse() {
URL feedUrl = new URL("http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml");
InputStream feedStream;
try {
feedStream = feedUrl.openConnection().getInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
final List<string> ret = new ArrayList<string>();
RootElement root = new RootElement("rss");
Element channel = root.getChild("channel");
Element item = channel.getChild("item");
item.getChild("media", "thumbnail").getChild("url").setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
ret.add(body);
}
});
try {
Xml.parse(feedStream, Xml.Encoding.UTF_8, root.getContentHandler());
} catch (Exception e) {
throw new RuntimeException(e);
}
return ret;
}
答案 0 :(得分:5)
我发现Xml解析器(在Froyo 2.2上)与名称空间前缀一起使用的一种方法是将名称空间URL指定为item.getChild()调用的第一个参数。例如,如果您的xml看起来像这样,您的代码可以使用xmlns url作为第一个参数。
<?xml version="1.0" encoding="utf-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sample="http://www.example_web_site_here.com/dtds/sample_schema.dtd" version="2.0">
<channel><item><sample:duration>1:00:00</sample:duration></item></channel></rss>
您的侦听器设置如下所示,以获取持续时间元素文本:
item.getChild("http://www.example_web_site_here.com/dtds/sample_schema.dtd", "duration").setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
this.itemDuration = body;
} });
它需要知道命名空间,但它一直在为我工作。就我而言,我知道名称空间。
答案 1 :(得分:0)
据我所知,“android”SAX解析器不支持命名空间(xmlns)嵌套(尽管rootelement对象特别提到了命名空间),剥离的“J2SE”SAX解析器也在路上瘫痪了, DOM解析器很重,但可以运行。
我使用DOM和XML命名空间成功,但更喜欢SAX解决方案,它不涉及在我的包中添加像JDOM这样的工作XML库。
答案 2 :(得分:0)
我不建议尝试实现自己的RSS解析器,而是使用标准库。
您需要迎合所有格式RSS 1,RSS 2,Atom等。即使这样,您也必须应对格式不佳的Feed。
我过去遇到过类似的问题所以决定在服务器上进行feed解析,然后获取解析后的内容。这允许我运行更复杂的库和解析器,我可以修改它而不会推出我的应用程序的更新。你必须真正的目标是保持你的应用程序轻量级,并尽可能多地推动它(对你自己的后端服务器)。
我在AppEngine上运行了以下服务,它允许在您的末尾进行更简单的XML / JSON解析。响应有一个固定而简单的结构。您可以使用它来解析
http://evecal.appspot.com/feedParser
您可以使用以下参数发送POST和GET请求。
feedLink:RSS提要响应的URL:JSON或XML作为响应格式
示例:
对于POST请求
curl --data-urlencode“feedLink = http://feeds.bbci.co.uk/news/world/rss.xml”--data-urlencode“response = json”http://evecal.appspot.com/feedParser
对于GET请求
evecal.appspot.com/feedParser?feedLink=http://feeds.nytimes.com/nyt/rss/HomePage&response=xml
我的Android应用程序“NewsSpeak”也使用它。