如何下载rss的部分

时间:2015-03-01 07:31:48

标签: java android http rss

如何下​​载rss的部分?

我需要一些方法来实现这一目标。我能理解上次修改的"页面#34;防止下载,但我想知道我是否可以只在RSS源中下载新项目?

2 个答案:

答案 0 :(得分:1)

如果你想要"只是一个部分" RSS提要(或扩展名,任何XML文档)您需要一个拉解析器。拉解析器是一种解析器,它允许决定要解析多少XML。例如,在100个项目的RSS源中,您可能希望在前25个项目之后停止解析。

XmlPullParser是您需要了解的内容。

现在,回到您想要仅下载新Feed的情况。是的你可以。方法如下:

  1. 首次运行应用程序时,您将RSS源中的所有项目保存到某个本地存储(可能是SQLite或.xml文件)。
  2. 下次运行应用程序时,从本地存储中检索最新项目。
  3. 连接到供稿网址并使用拉解析器开始解析。
  4. 继续将您找到的每个新项目添加到本地存储中。
  5. 点击从本地存储中检索到的最新项目后,请停止解析。你肯定知道你拥有超出这一点的所有项目。
  6. 为了完整起见,还有一个推送解析器。推送解析器是一种解析器,一旦启动,就会一直解析XML,直到它到达文件末尾或生成一些异常。 SAXParser是推送解析器。

答案 1 :(得分:1)

使用XmlPullParser解析您的内容。一旦你找到pubDate比你正在寻找的项目更早的项目,就要突破循环。这是我编写的一些旧代码。

我最终发现,下载我希望解析并在本地存储它们的所有RSS源比使用一个接一个地解析它们并解析它们更有效。

public static List<Content> parseNewEpisodesFromXml(InputStream stream,
        long id, long oldPubDate) throws XmlPullParserException,
        IOException, ParseException {
    List<Content> content = new ArrayList<Content>();
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XmlPullParser xpp = factory.newPullParser();
    xpp.setInput(stream, "UTF-8");

    int eventType = xpp.getEventType();

    SimpleDateFormat pubDateFormatter = new SimpleDateFormat(
            "EEE, dd MMM yyy HH:mm:ss zzzz");

    Content content = new Content()
    boolean oldContentFound = false;

    while (eventType != XmlPullParser.END_DOCUMENT || !oldContentFound) {
        name = xpp.getName();
        switch (eventType) {

        case (XmlPullParser.END_TAG):
            // end stuff here
            brea;
        case (XmlPullParser.START_TAG):
            if {
                // do your thing here...
            } else if (name.matches("pubDate") {

                content = xpp.nextText();
                Date pubDate = pubDateFormatter.parse(content);
                if (oldPubDate == pubDate.getTime()) {
                    oldContentFound = true;
                    break;
                }
            }
            break;

        }
        eventType = xpp.next();
    } 

}