Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android:如何在网站包含时下载RSS:link rel =“alternate”type =“application / rss xml”大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个RSS相关的应用程序.
我希望能够下载仅包含以下网站URL的RSS(xml):

link rel =“alternate”type =“application / RSS xml”

例如,http://www.engaget.com源包含:

<link rel="alternate" type="application/RSS+xml" title="Engadget" href="http://www.engadget.com/RSS.xml">

我假设如果我将此站点作为RSS应用程序打开,它将重定向http://www.engadget.com/rss.xml页面.

我下载xml的代码如下:

private Boolean downloadXml(String url,String fileName) {
        try {
            URL   urlxml = new URL(url);
            URLConnection ucon = urlxml.openConnection();
            ucon.setConnectTimeout(4000);
            ucon.setReadTimeout(4000);
            InputStream is = ucon.geTinputStream();
            BufferedInputStream bis = new BufferedInputStream(is,128);
            FiLeoutputStream fOut = openFiLeoutput(filename + ".xml",Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
            OutputStreamWriter osw = new OutputStreamWriter(fOut);
            int current = 0;
            while ((current = bis.read()) != -1) {
                osw.write((bytE) current);
            }
            osw.flush();
            osw.close();

        } catch (Exception E) {
            return false;
        }
        return true;
    }

在我不知道’http://www.engadget.com/RSS.xml’url的情况下,当我输入’http://www.engadget.com’时如何下载RSS

解决方法

要实现这一目标,您需要:

>检测URL是否指向HTML文件.请参阅下面的代码中的isHtml方法.
>如果URL指向HTML文件,请从中提取RSS URl.请参阅下面的代码中的extractRSSUrl方法.

以下代码是您在问题中粘贴的代码修改版本.对于I / O,我使用Apache Commons IO作为有用的IoUtils和FileUtils类. IoUtils.toString用于将输入流转换为字符串,如文章In Java,how do I read/convert an InputStream to a String?”中所建议的那样

extractRSSUrl使用正则表达式来解析HTML,即使它非常不受欢迎. (参见“RegEx match open tags except XHTML self-contained tags”中的咆哮.)虑到这一点,让extractRSSUrl成为一个起点. extractRSSUrl中的正则表达式是基本的,并未涵盖所有情况.

请注意,对isRSS(str)的调用已被注释掉.如果要进行RSS检测,请参阅“How to detect if a page is an RSS or ATOM feed”.

private Boolean downloadXml(String url,String fileName) {
    InputStream is = null;
    try {
        URL urlxml = new URL(url);
        URLConnection ucon = urlxml.openConnection();
        ucon.setConnectTimeout(4000);
        ucon.setReadTimeout(4000);
        is = ucon.geTinputStream();
        String str = IoUtils.toString(is,"UTF-8");
        if (isHtml(str)) {
            String RSSURL = extractRSSUrl(str);
            if (RSSURL != null && !url.equals(RSSURL)) {
                return downloadXml(RSSURL,filename + ".xml");
            }
        } else { // if (isRSS(str)) {
            // For Now,we'll assume that we're an RSS Feed at this point
            FileUtils.write(new File(fileName),str);
            return true;
        }
    } catch (Exception E) {
        // do nothing
    } finally {
        IoUtils.closeQuietly(is);
    }
    return false;
}

private Boolean isHtml(String str) {
    Pattern pattern = Pattern.compile("<html",Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
    Matcher matcher = pattern.matcher(str);
    return matcher.find();
}

private String extractRSSUrl(String str) {
    Pattern pattern = Pattern.compile("<link(?:\\s+href=\"([^\"]*)\"|\\s+[a-z\\-]+=\"[^\"]*\")*\\s+type=\"application/RSS\\+(?:xml|atom)\"(?:\\s+href=\"([^\"]*)\"|\\s+[a-z\\-]+=\"[^\"]*\")*?\\s*/?>",Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
    Matcher matcher = pattern.matcher(str);
    if (matcher.find()) {
        for (int i = 1; i <= matcher.groupCount(); i++) {
            if (matcher.group(i) != null) {
                return matcher.group(i);
            }
        }
    }
    return null;
}

上面的代码适用于您的Engadget示例:

obj.downloadXml("http://www.engadget.com/","RSS");
@H_301_58@

大佬总结

以上是大佬教程为你收集整理的Android:如何在网站包含时下载RSS:link rel =“alternate”type =“application / rss xml”全部内容,希望文章能够帮你解决Android:如何在网站包含时下载RSS:link rel =“alternate”type =“application / rss xml”所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。