如何解决如何从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 举报,一经查实,本站将立刻删除。