jsp中实现读取RSS——SAX解析XML

今天由于公司项目需要接触了读取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;}

 

你可能感兴趣的:(jsp中实现读取RSS——SAX解析XML)