今天由于公司项目需要接触了读取RSS的知识。
先介绍一下项目需求——给定RSS的链接,要求只读取出其中的6条带链接的title。
到网上一搜,全是关于ROME来读取RSS的例子。开始我也选用了REMO来实现,结果发现显示速度那是相当的慢啊。于是开始研究自己写xml的解析。选用了SAX,关于为什么选取SAX而不选择DOME,网上说明一大堆,此处不再赘述。
1、建立RssReader类extends DefaultHandler。
覆盖startDocument(),endDocument(),startElement(),endElement(),characters()四个方法。
startDocument():当xml文档开始解析时调用。
endDocument():当xml文档解析完毕时调用。
startElement():当解析遇到标签时执行,如<title><name>等。
endElement():当遇到结束标签时执行,如</title></name>等。
characters():从当前正在解析的element中解析出数据。
由于只需要获得前6条数据,因此只需要在解析到6条记录后便停止。
2、类中定义如下变量:
private int maximumResults =6;//解析的数据条数,可通过传参动态改变
private static final int MAX_ELEMENTS = 500;//在停止之前可以允许的最大解析条数,即在element中碰到</...>之前深入的层数
private int ecount = 0;//记录当前深入的层数 。
private int rcount =0;//记录当前已经得到的记录数。
private String currentText="";//解析得到的数据
private ArrayList News = new ArrayList();//存储得到的数据
private BlogInfo NI = null;//存储数据结构
3、返回解析得到的数据方法(以HTML格式返回);
public synchronized String parse() {try {XMLReader xr = XMLReaderFactory.createXMLReader();xr.setContentHandler(this);xr.setErrorHandler(this);URL u = new URL(Url);URLConnection UC = u.openConnection();/* * If we don't set the user-agent property sites like Google won't * let you access their feeds. *///UC.setRequestProperty("User-agent", "www.plink-search.com");InputStreamReader r = new InputStreamReader(UC.getInputStream());xr.parse(new InputSource(r));} catch (Exception e) {}// Output all the parsed news items as HTML.for (int i = 0; i < News.size(); i++) {output += ((BlogInfo) News.get(i)).toString();}return (output);}
4、startElement()方法:
// Called when we begin parsing the XML file.public void startElement(String uri, String name, String qName,Attributes atts) throws SAXException {// qName contains the non-URI name of the XML element.if (qName.equals("item")) {if (NI != null) {// We've fetched another news item.if (rcount >= maximumResults) {// Maximum results have been reached.throw new SAXException("/nLimit reached.");}else{rcount++;// Add it to our ArrayList.News.add(NI);}}// Create a new NewsItem to add data to.NI = new BlogInfo();}}
5、endElement()方法():
// We've reached the end of an XML element.public void endElement(String uri, String name, String qName)throws SAXException {if (qName.equals("title") && NI != null) {// Are we parsing a news item?currentText=SysUtil.subString(currentText, 0, 47);NI.setTitle(currentText);} else if (qName.equals("link") && NI != null)NI.setURL(currentText);// Make sure we don't attempt to parse too long of a document.currentText = "";ecount++;if (ecount > MAX_ELEMENTS)throw new SAXException("/nLimit reached");}
6、characters方法():
// Parse characters from the current element we're parsing.public void characters(char ch[], int start, int length) {for (int i = start; i < start + length; i++) {currentText += ch[i];}}
7、BlogInfo类:
class BlogInfo {private String Title = "";private String URL = "";// Set the title of the NewsItem.public void setTitle(String Title) {this.Title = Title;}// Set the URL (Link) of the NewsItem.public void setURL(String URL) {this.URL = URL;}// Return an HTML representation of our news story.public String toString() {String returnMe = "";returnMe += "<a href="/" mce_href="/""" + URL + "/">" + Title + "</a><br/>";return (returnMe);}public String getTitle() {return Title;}public String getURL() {return URL;}