XML解析(RSS阅读器)

例子中使用的种子是:http://news.163.com/special/00011K6L/rss_newstop.xml

一定要记得在Manifest里面加入Internet访问的允许 


XMLParseActivity.java

package com.zeph.android.xml;

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.Iterator;
import java.util.List;

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.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class XMLParseActivity extends Activity {
	private Button XmlParseButton;
	private String XmlSourceStr;
	private MyXmlHandler myXmlHandler;
	private List<RssNews> newsList;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		XmlParseButton = (Button) findViewById(R.id.XMLparseButton);
		XmlParseButton.setOnClickListener(new MyButtonClickListener());
		newsList = new ArrayList<RssNews>(100);
		myXmlHandler = new MyXmlHandler(newsList);
	}

	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 MyButtonClickListener implements OnClickListener {

		@Override
		public void onClick(View view) {
			if (view == XmlParseButton) {
				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();
						System.out.println(news.getTitle());
						System.out.println(news.getPubDate());
						System.out.println(news.getLink());
						System.out.println("---------------------------------");
					}
				}
			}
		}
	}
}


MyXmlHandler.java

package com.zeph.android.xml;

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.xml;

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) {
		super();
		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;
	}

}


 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值