如何从RSS源打开Web视图

如何解决如何从RSS源打开Web视图

| 我有一个简单的RSS阅读器,它显示给定提要中的项目,我遇到的问题是我不知道如何获取新闻项目的网址,以便当用户单击该项目时,它会在Web视图中打开。知道如何将字符串传递给另一个类,以打开Webview等等...但是我不知道如何获取url,因此可以打开该项目。下面是文章类;
    public static List<JSONObject> getLatestRssFeed(){
    String feed = \"http://globoesporte.globo.com/dynamo/futebol/times/vasco/rss2.xml\";


    RSSHandler rh = new RSSHandler();
    List<Article> articles =  rh.getLatestArticles(feed);
    Log.e(\"RSS ERROR\",\"Number of articles \" + articles.size());
    return fillData(articles);
}



private static List<JSONObject> fillData(List<Article> articles) {

    List<JSONObject> items = new ArrayList<JSONObject>();
    for (Article article : articles) {
        JSONObject current = new JSONObject();
        try {
            buildJsonObject(article,current);
        } catch (JSONException e) {
            Log.e(\"RSS ERROR\",\"Error creating JSON Object from RSS feed\");
        }
        items.add(current);
    }

    return items;
}
 */
private static void buildJsonObject(Article article,JSONObject current) throws JSONException {
    String title = article.getTitle();
    String description = article.getDescription();
    String date = article.getPubDate();
    String imgLink = article.getImgLink();


    StringBuffer sb = new StringBuffer();
    sb.append(BOLD_OPEN).append(title).append(BOLD_CLOSE);
    sb.append(BREAK);
    sb.append(description);
    sb.append(BREAK);
    sb.append(SMALL_OPEN).append(ITALIC_OPEN).append(date).append(ITALIC_CLOSE).append(SMALL_CLOSE);

    current.put(\"text\",Html.fromHtml(sb.toString()));
    current.put(\"imageLink\",imgLink);
}
} 这是rsshandler类;
public class RSSHandler extends DefaultHandler {

// Feed and Article objects to use for temporary storage
private Article currentArticle = new Article();
private List<Article> articleList = new ArrayList<Article>();

// Number of articles added so far
private int articlesAdded = 0;

// Number of articles to download
private static final int ARTICLES_LIMIT = 15;

//Current characters being accumulated
StringBuffer chars = new StringBuffer();


/* 
 * This method is called everytime a start element is found (an opening XML marker)
 * here we always reset the characters StringBuffer as we are only currently interested
 * in the the text values stored at leaf nodes
 * 
 * (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,java.lang.String,org.xml.sax.Attributes)
 */
public void startElement(String uri,String localName,String qName,Attributes atts) {
    chars = new StringBuffer();
}



/* 
 * This method is called everytime an end element is found (a closing XML marker)
 * here we check what element is being closed,if it is a relevant leaf node that we are
 * checking,such as Title,then we get the characters we have accumulated in the StringBuffer
 * and set the current Article\'s title to the value
 * 
 * If this is closing the \"Item\",it means it is the end of the article,so we add that to the list
 * and then reset our Article object for the next one on the stream
 * 
 * 
 * (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,java.lang.String)
 */
public void endElement(String uri,String qName) throws SAXException {

    if (localName.equalsIgnoreCase(\"title\"))
    {
        Log.d(\"LOGGING RSS XML\",\"Setting article title: \" + chars.toString());
        currentArticle.setTitle(chars.toString());

    }
    else if (localName.equalsIgnoreCase(\"description\"))
    {
        Log.d(\"LOGGING RSS XML\",\"Setting article description: \" + chars.toString());
        currentArticle.setDescription(chars.toString());
    }
    else if (localName.equalsIgnoreCase(\"pubDate\"))
    {
        Log.d(\"LOGGING RSS XML\",\"Setting article published date: \" + chars.toString());
        currentArticle.setPubDate(chars.toString());
    }
    else if (localName.equalsIgnoreCase(\"encoded\"))
    {
        Log.d(\"LOGGING RSS XML\",\"Setting article content: \" + chars.toString());
        currentArticle.setEncodedContent(chars.toString());
    }
    else if (localName.equalsIgnoreCase(\"item\"))
    {

    }
    else if (localName.equalsIgnoreCase(\"link\"))
    {
        try {
            Log.d(\"LOGGING RSS XML\",\"Setting article link url: \" + chars.toString());
            currentArticle.setUrl(new URL(chars.toString()));
        } catch (MalformedURLException e) {
            Log.e(\"RSA Error\",e.getMessage());
        }

    }




    // Check if looking for article,and if article is complete
    if (localName.equalsIgnoreCase(\"item\")) {

        articleList.add(currentArticle);

        currentArticle = new Article();

        // Lets check if we\'ve hit our limit on number of articles
        articlesAdded++;
        if (articlesAdded >= ARTICLES_LIMIT)
        {
            throw new SAXException();
        }
    }
}





/* 
 * This method is called when characters are found in between XML markers,however,there is no
 * guarante that this will be called at the end of the node,or that it will be called only once
 *,so we just accumulate these and then deal with them in endElement() to be sure we have all the
 * text
 * 
 * (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#characters(char[],int,int)
 */
public void characters(char ch[],int start,int length) {
    chars.append(new String(ch,start,length));
}





/**
 * This is the entry point to the parser and creates the feed to be parsed
 * 
 * @param feedUrl
 * @return
 */
public List<Article> getLatestArticles(String feedUrl) {
    URL url = null;
    try {

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        url = new URL(feedUrl);

        xr.setContentHandler(this);
        xr.parse(new InputSource(url.openStream()));


    } catch (IOException e) {
        Log.e(\"RSS Handler IO\",e.getMessage() + \" >> \" + e.toString());
    } catch (SAXException e) {
        Log.e(\"RSS Handler SAX\",e.toString());
    } catch (ParserConfigurationException e) {
        Log.e(\"RSS Handler Parser Config\",e.toString());
    }

    return articleList;
}
} 这是文章类;
public class Article {

private long articleId;
private long feedId;
private String title;
private String description;
private String imgLink;
private String pubDate;
private URL  url;
private String encodedContent;
/**
 * @return the articleId
 */
public long getArticleId() {
    return articleId;
}
/**
 * @param articleId the articleId to set
 */
public void setArticleId(long articleId) {
    this.articleId = articleId;
}
/**
 * @return the feedId
 */
public long getFeedId() {
    return feedId;
}
/**
 * @param feedId the feedId to set
 */
public void setFeedId(long feedId) {
    this.feedId = feedId;
}
/**
 * @return the title
 */
public String getTitle() {
    return title;
}
/**
 * @param title the title to set
 */
public void setTitle(String title) {
    this.title = title;
}
/**
 * @return the url
 */
public URL getUrl() {
    return url;
}
/**
 * @param url the url to set
 */
public void setUrl(URL url) {
    this.url = url;
}
/**
 * @param description the description to set
 */
public void setDescription(String description) {
    this.description = description;

    //parse description for any image or video links
    if (description.contains(\"<img \")){
        String img  = description.substring(description.indexOf(\"<img \"));
        String cleanUp = img.substring(0,img.indexOf(\">\")+1);
        img = img.substring(img.indexOf(\"src=\") + 5);
        int indexOf = img.indexOf(\"\'\");
        if (indexOf==-1){
            indexOf = img.indexOf(\"\\\"\");
        }
        img = img.substring(0,indexOf);

        setImgLink(img);

        this.description = this.description.replace(cleanUp,\"\");
    }
}
/**
 * @return the description
 */
public String getDescription() {
    return description;
}
/**
 * @param pubDate the pubDate to set
 */
public void setPubDate(String pubDate) {
    this.pubDate = pubDate;
}
/**
 * @return the pubDate
 */
public String getPubDate() {
    return pubDate;
}
/**
 * @param encodedContent the encodedContent to set
 */


public void setEncodedContent(String encodedContent) {
    this.encodedContent = encodedContent;
}
/**
 * @return the encodedContent
 */
public String getEncodedContent() {
    return encodedContent;
}
/**
 * @param imgLink the imgLink to set
 */
public void setImgLink(String imgLink) {
    this.imgLink = imgLink;
}
/**
 * @return the imgLink
 */
public String getImgLink() {
    return imgLink;
}
}     

解决方法

谢谢Yeradis,您只是将它添加到了代码中; 在Handler类中:
else if (localName.equalsIgnoreCase(\"link\"))
    {
        Log.d(\"LOGGING RSS XML\",\"Setting article link: \" + chars.toString());
        currentArticle.setLink(chars.toString());
在Article类中:
private String link;
public String getLink() {
    return link;
}
/**
 * @param title the title to set
 */
public void setLink(String link) {
    this.link = link;
}
在Reader类中
String link = article.getLink();
current.put(\"link\",link);
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-