通常Rss会是一个XML形式.所以也就是解析XML了,至于如何解析,到处都可以查到,在Android主要有三种,DOM,SAX,XMLPULL,当然如果把一些JAR弄进来也可以使用很简单的API来处理.因为Android内置了一些解析器,所以不会太有困难的.
先定义一个RssBean,属性有
private String title;
private String description;
private String link;
private String language;
private String pubDate;//Sun, 16 May 2010 10:18:46 +0800
时间格式暂不转换,因为不需要
然后解析一个XML把它解析成一个RssBean组成的List.
先定义一个RssBean,属性有
private String title;
private String description;
private String link;
private String language;
private String pubDate;//Sun, 16 May 2010 10:18:46 +0800
时间格式暂不转换,因为不需要
然后解析一个XML把它解析成一个RssBean组成的List.
- public List<RssBean> rssList=new ArrayList<RssBean>();//只包含了item
- private StringBuilder sb=new StringBuilder();//处理节点中的文本串
- RssBean rb=null;
- boolean flag=false;//麻烦的是在<item></item>中有Link和Title而它前面也有,所以这是烂招了,如果有更好的处理方式,喜欢讨论.
- 解析方法:
- public void parseRss(String urlString) throws ParserConfigurationException,SAXException,MalformedURLException,IOException{
- SAXParserFactory factory=SAXParserFactory.newInstance();
- SAXParser parser=factory.newSAXParser();
- URL url=new URL(urlString);
- /*HttpURLConnection connection=(HttpURLConnection)url.openConnection();
- if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
- parser.parse(connection.getInputStream(),this);
- }*/
- XMLReader xmlReader = parser.getXMLReader();
- InputSource is = new InputSource(url.openStream());
- xmlReader.setContentHandler(this);
- xmlReader.parse(is);
- //connection=null;
- factory=null;
- parser=null;
- }
- 由于xmlReader.setContentHandler(this);所以,这个解析类继承了extends DefaultHandler,当然覆盖了一些方法:
- @Override
- public void startElement(String uri,String localName,String qName,
- Attributes attributes) throws SAXException{
- System.out.println("startElement:"+qName+"***"+localName);
- //在J2SE中使用SAX,qName是有东西的.这里是空的.
- if(qName.equals("item")||"item".equals(localName)){ //检测到了一个Item就新建一个Bean.
- if(!flag){
- System.out.println("\n========================================");
- }
- flag=true;//防止检查前面的元素.
- //System.out.println(qName);
- rb=new RssBean();
- }
- }
- @Override
- public void characters(char[] ch,int start,int length) throws SAXException{
- //System.out.print(new String(ch,start,length));
- sb.append(new String(ch,start,length));
- }
- @Override
- public void endElement(String uri,String localName,String qName) throws SAXException{
- System.out.println("\nendElement***qName:"+qName);//因为DTD handlers aren't supported,所以qName为空?不是.
- System.out.println("localName:"+localName);
- if(qName.equals("item")||"item".equals(localName)){
- rssList.add(rb);
- //rb=null;
- System.out.println("endElement.rssList:"+rssList.size());
- }else if(qName.equals("title")||"title".equals(localName)){
- if(flag){
- rb.setTitle(sb.toString().trim());//这里需要去除空格.
- System.out.println("添加了title:"+sb.toString().trim());
- //
- }
- }else if(qName.equals("description")||"description".equals(localName)){
- if(flag){
- rb.setDescription(sb.toString().trim());
- //System.out.println("添加了Description:"+sb.toString().trim());
- }
- }else if(qName.equals("link")||"link".equals(localName)){
- if(flag){
- rb.setLink(sb.toString().trim());
- System.out.println("添加了Link:"+sb.toString().trim());
- }
- }else if(qName.equals("language")||"language".equals(localName)){
- rb.setLanguage(sb.toString().trim());
- System.out.println("添加了language:"+sb.toString().trim());
- }else if(qName.equals("pubDate")||"pubDate".equals(localName)){
- rb.setPubDate(sb.toString().trim());
- System.out.println("添加了pubDate:"+sb.toString().trim());
- }
- sb.setLength(0);// 清除内容.
- }
- @Override
- public void startDocument() throws SAXException{
- System.out.println("startDocument");
- }
- @Override
- public void endDocument() throws SAXException{
- System.out.println("endDocument\n===================================");
- /*for(int i=0;i<rssList.size();i++){
- RssBean tmpBean=rssList.get(i);
- System.out.println("标题:"+tmpBean.getTitle());
- System.out.println("日期:"+tmpBean.getPubDate());
- System.out.println("链接"+tmpBean.getLink());
- System.out.println("语言:"+tmpBean.getLanguage());
- }*/
- }
- 这样解析就完成了.使用DOM似乎更简单些.不过它需要载入整个文档才通解析,耗费内存多些.
- public void parseRss(String urlStr){
- DocumentBuilderFactory builderFactory=null;
- DocumentBuilder docBuilder=null;
- Document doc=null;
- URL url;
- try{
- url=new URL(urlStr);
- URLConnection connection=url.openConnection();
- HttpURLConnection httpURLConnection=(HttpURLConnection)connection;
- int responseCode=httpURLConnection.getResponseCode();
- if(responseCode==HttpURLConnection.HTTP_OK){
- InputStream in=httpURLConnection.getInputStream();
- builderFactory=DocumentBuilderFactory.newInstance();
- docBuilder=builderFactory.newDocumentBuilder();
- //xml file 放到 assets目录中的
- //doc=docBuilder.parse(new File(url));
- doc=docBuilder.parse(in);
- //rootE element
- Element rootE=doc.getDocumentElement();
- //Do something here get a NodeList by tagname
- Element element;
- //System.out.println("channel node:"+ele);
- Element channelEle=(Element)rootE.getElementsByTagName("channel").item(0);
- //parseChannel(channelEle);
- NodeList itemList=channelEle.getElementsByTagName("item");
- int len2=itemList.getLength();
- rssItemList.clear();
- for(int j=0;j<len2;j++){
- element=(Element)itemList.item(j);
- RssBean rb=new RssBean();
- NodeList titleNodeList=element.getElementsByTagName("title");
- parseTitle(titleNodeList,rb);
- titleNodeList=element.getElementsByTagName("description");
- parseDescription(titleNodeList,rb);
- titleNodeList=element.getElementsByTagName("link");
- parseLink(titleNodeList,rb);
- titleNodeList=element.getElementsByTagName("pubDate");
- parsePubDate(titleNodeList,rb);
- System.out.println(rb.getTitle()+"**"+rb.getLink());
- rssItemList.add(rb);
- //而这些都是简单的方法.
- System.out.println("parseRss:"+rssItemList.size());
- }
- }
- }catch(MalformedURLException e){
- e.printStackTrace();
- }catch(IOException e){
- e.printStackTrace();
- }catch(SAXException e){
- e.printStackTrace();
- }catch(ParserConfigurationException e){
- e.printStackTrace();
- }finally{
- doc=null;
- docBuilder=null;
- builderFactory=null;
- }
- }
- //在J2Se中有GetTextContent,而这里就没有了.在文档里也写了根据节点的类型来处理getNodeValue(),节点类型为3时表示是文本节点,取之有值,其它的为Null.并且成了子节点,nodeName为#text.
- private void parseTitle(NodeList titleNodeList,RssBean rb) throws DOMException{
- rb.setTitle(titleNodeList.item(0).getFirstChild().getNodeValue());
- }
- /**
- * 处理描述
- * @param titleNodeList 节点列表
- * @param rb RssBean
- * @throws DOMException
- */
- private void parseDescription(NodeList titleNodeList,RssBean rb) throws DOMException{
- rb.setDescription(titleNodeList.item(0).getFirstChild().getNodeValue());
- }
- /**
- * 处理链接
- * @param linkList 节点列表
- * @param rb RssBean
- * @throws DOMException
- */
- private void parseLink(NodeList linkList,RssBean rb) throws DOMException{
- rb.setLink(linkList.item(0).getFirstChild().getNodeValue());
- }
- /**
- * 处理发布日期
- * @param titleNodeList 节点列表
- * @param rb RssBean
- * @throws DOMException
- */
- private void parsePubDate(NodeList titleNodeList,RssBean rb) throws DOMException{
- rb.setPubDate(titleNodeList.item(0).getFirstChild().getNodeValue());
- }
浙公网安备 33010602011771号