【问题标题】:Processing RSS Feeds with Namespaces in Android在 Android 中使用命名空间处理 RSS 提要
【发布时间】:2011-02-11 14:19:45
【问题描述】:

我正在尝试编写一个 XML 解析器,它接受 RSS 提要并获取 <media:thumbnail> 标记的 url 属性中显示的图像 url。这一切都是通过android.Util.Xml 完成的,并且是the code shown here 的改编版。我尝试使用的一个示例 RSS 提要是 BBC News RSS feed。

但是,媒体是一个额外的命名空间&(可能)因此我的解析器无法正常工作。

下面是我的解析方法的一个版本。是否有任何(无疑是简单的)方法可以让我的图片 URL 列表正常工作?

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

【问题讨论】:

    标签: android rss namespaces xml-namespaces


    【解决方案1】:

    据我所知,“android”SAX 解析器不支持命名空间 (xmlns) 嵌套(尽管 rootelement 对象特别提到了命名空间),被剥离的“J2SE”SAX 解析器也被削弱了,并且DOM 解析器很重,但可操作。

    我成功地将 DOM 与 XML 命名空间一起使用,但我更喜欢不涉及向我的包中添加像 JDOM 这样的工作 XML 库的 SAX 解决方案。

    【讨论】:

      【解决方案2】:

      我发现 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;
                  } });
      

      它需要命名空间的知识,但它一直对我有用。就我而言,我知道名称空间。

      【讨论】:

      • 是的,在这种情况下,我知道命名空间的名称——当我在这里编码时,我使用的是 Eclair,但我感觉这也可能在那里工作。最肯定的是,最后我使用了 J2SE SAX 方法,为此你必须指定命名空间 url - 我从来没有用“Android”解析器给它一个旋转。
      【解决方案3】:

      我不建议尝试实现自己的 RSS 解析器,而是使用标准库。

      您需要满足所有格式 RSS 1、RSS 2、Atom 等。即便如此,您也必须应对格式不佳的提要。

      我过去曾遇到过类似的问题,因此决定在服务器上进行提要解析并获取解析后的内容。这允许我运行更复杂的库和解析器,我可以在不为我的应用程序推出更新的情况下对其进行修改。您必须真正致力于保持您的应用程序的轻量级,并尽可能多地从其中推出逻辑(到您自己的后端服务器)。

      我在 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

      我的安卓应用“NewsSpeak”也使用这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        相关资源
        最近更新 更多