XML解析(RSS阅读器)ListActivity实现

XML解析(RSS阅读器)ListActivity实现

XML解析(RSS阅读器)ListActivity实现

程序里解析的是网易的RSS:http://news.163.com/special/00011K6L/rss_newstop.xml

仍然记住要在Manifest里面注册Internet访问权限。

简单的RSS的XML文件标准格式是这样的:

<?xml version="1.0" encoding="GBK"?> <item id="1"> <title></title> <link></link> <description></description> <pubDate></pubDate> </item> <item id="2"> <title></title> <link></link> <description></description> <pubDate></pubDate> </item>


res/layout/news_item.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight"> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@android:color/white" android:textStyle="bold" android:layout_alignParentTop="true" android:gravity="left" /> <TextView android:id="@+id/pubDate" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/title" android:gravity="left" /> </RelativeLayout>

RssReaderListActivity.java

package com.zeph.android.rss.reader; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import android.app.ListActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; public class RssReaderListActivity extends ListActivity { private String XmlSourceStr; private MyXmlHandler myXmlHandler; private List<RssNews> newsList; private ListView mListView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = getListView(); newsList = new ArrayList<RssNews>(100); myXmlHandler = new MyXmlHandler(newsList); ArrayList<Map<String, Object>> mData = new ArrayList<Map<String, Object>>(); XmlConnection("http://news.163.com/special/00011K6L/rss_newstop.xml"); XmlParse(); if (!newsList.isEmpty()) { Iterator<RssNews> it = newsList.iterator(); while (it.hasNext()) { RssNews news = (RssNews) it.next(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("title", news.getTitle()); map.put("pubDate", news.getPubDate()); mData.add(map); } } SimpleAdapter adapter = new SimpleAdapter(this, mData, R.layout.news_item, new String[] { "title", "pubDate" }, new int[] { R.id.title, R.id.pubDate }); setListAdapter(adapter); mListView.setOnItemClickListener(new ListOnItemClick()); } public void XmlConnection(String urlStr) { URL url = null; try { url = new URL(urlStr); } catch (MalformedURLException e) { e.printStackTrace(); } if (url != null) { try { HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); InputStreamReader isReader = new InputStreamReader( urlConnection.getInputStream(), "GBK"); BufferedReader br = new BufferedReader(isReader); StringBuffer sb = new StringBuffer(); String line = null; while ((line = br.readLine()) != null) { sb.append(line); } isReader.close(); urlConnection.disconnect(); XmlSourceStr = sb.toString(); } catch (IOException e) { e.printStackTrace(); } } } public void XmlParse() { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setContentHandler(myXmlHandler); reader.parse(new InputSource(new StringReader(XmlSourceStr))); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public class ListOnItemClick implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { RssNews news = newsList.get(position); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(news.getLink())); startActivity(intent); } } }

MyXmlHandler.java

package com.zeph.android.rss.reader; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyXmlHandler extends DefaultHandler { private String XMLParseName; private List<RssNews> NewsList; private RssNews News; public MyXmlHandler(List<RssNews> NewsList) { this.NewsList = NewsList; } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String value = new String(ch, start, length); if (XMLParseName.equals("title")) { News.setTitle(value); } else if (XMLParseName.equals("link")) { News.setLink(value); } else if (XMLParseName.equals("description")) { News.setDescription(value); } else if (XMLParseName.equals("pubDate")) { News.setPubDate(value); } } @Override public void startDocument() throws SAXException { super.startDocument(); } /** * uri是命名空间 URI localName是不带命名空间前缀的标签名 qName是带命名空间前缀的标签名 * attributes可以得到所有的属性名和相应的值 * * @param */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if (localName.equals("title")) { News = new RssNews(); } XMLParseName = localName; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if (localName.equals("item")) { NewsList.add(News); } } @Override public void endDocument() throws SAXException { super.endDocument(); } }


RssNews.java

package com.zeph.android.rss.reader; public class RssNews { /** 新闻标题 **/ private String title; /** 新闻链接 **/ private String link; /** 新闻描述 **/ private String description; /** 新闻发表时间 **/ private String pubDate; public RssNews() { } public RssNews(String title, String link, String description, String pubDate) { this.title = title; this.link = link; this.description = description; this.pubDate = pubDate; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPubDate() { return pubDate; } public void setPubDate(String pubDate) { this.pubDate = pubDate; } }