通常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. 
Java代码 
  1. public List<RssBean> rssList=new ArrayList<RssBean>();//只包含了item  
  2.     private StringBuilder sb=new StringBuilder();//处理节点中的文本串  
  3.     RssBean rb=null;  
  4.     boolean flag=false;//麻烦的是在<item></item>中有Link和Title而它前面也有,所以这是烂招了,如果有更好的处理方式,喜欢讨论.  
  5. 解析方法:  
  6. public void parseRss(String urlString) throws ParserConfigurationException,SAXException,MalformedURLException,IOException{  
  7.         SAXParserFactory factory=SAXParserFactory.newInstance();  
  8.         SAXParser parser=factory.newSAXParser();          
  9.         URL url=new URL(urlString);  
  10.         /*HttpURLConnection connection=(HttpURLConnection)url.openConnection(); 
  11.         if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){ 
  12.             parser.parse(connection.getInputStream(),this); 
  13.         }*/  
  14.         XMLReader xmlReader = parser.getXMLReader();   
  15.         InputSource is = new InputSource(url.openStream());   
  16.         xmlReader.setContentHandler(this);  
  17.         xmlReader.parse(is);  
  18.         //connection=null;  
  19.         factory=null;  
  20.         parser=null;  
  21.     }  
  22. 由于xmlReader.setContentHandler(this);所以,这个解析类继承了extends DefaultHandler,当然覆盖了一些方法:  
  23. @Override  
  24.     public void startElement(String uri,String localName,String qName,  
  25.         Attributes attributes) throws SAXException{  
  26.         System.out.println("startElement:"+qName+"***"+localName);  
  27. //在J2SE中使用SAX,qName是有东西的.这里是空的.  
  28.         if(qName.equals("item")||"item".equals(localName)){   //检测到了一个Item就新建一个Bean.  
  29.             if(!flag){  
  30.                 System.out.println("\n========================================");  
  31.             }  
  32.             flag=true;//防止检查前面的元素.  
  33.             //System.out.println(qName);  
  34.             rb=new RssBean();  
  35.         }  
  36.     }  
  37.   
  38.     @Override  
  39.     public void characters(char[] ch,int start,int length) throws SAXException{  
  40.         //System.out.print(new String(ch,start,length));  
  41.         sb.append(new String(ch,start,length));  
  42.     }  
  43.   
  44.     @Override  
  45.     public void endElement(String uri,String localName,String qName) throws SAXException{  
  46.         System.out.println("\nendElement***qName:"+qName);//因为DTD handlers aren't supported,所以qName为空?不是.  
  47.         System.out.println("localName:"+localName);  
  48.         if(qName.equals("item")||"item".equals(localName)){  
  49.             rssList.add(rb);  
  50.             //rb=null;  
  51.             System.out.println("endElement.rssList:"+rssList.size());  
  52.         }else if(qName.equals("title")||"title".equals(localName)){  
  53.             if(flag){  
  54.                 rb.setTitle(sb.toString().trim());//这里需要去除空格.  
  55.                 System.out.println("添加了title:"+sb.toString().trim());  
  56. //  
  57.             }  
  58.         }else if(qName.equals("description")||"description".equals(localName)){  
  59.             if(flag){  
  60.                 rb.setDescription(sb.toString().trim());  
  61.                 //System.out.println("添加了Description:"+sb.toString().trim());  
  62.             }  
  63.         }else if(qName.equals("link")||"link".equals(localName)){  
  64.             if(flag){  
  65.                 rb.setLink(sb.toString().trim());  
  66.                 System.out.println("添加了Link:"+sb.toString().trim());  
  67.             }  
  68.         }else if(qName.equals("language")||"language".equals(localName)){  
  69.             rb.setLanguage(sb.toString().trim());  
  70.             System.out.println("添加了language:"+sb.toString().trim());  
  71.         }else if(qName.equals("pubDate")||"pubDate".equals(localName)){  
  72.             rb.setPubDate(sb.toString().trim());  
  73.             System.out.println("添加了pubDate:"+sb.toString().trim());  
  74.         }  
  75.         sb.setLength(0);// 清除内容.          
  76.     }  
  77.   
  78.     @Override  
  79.     public void startDocument() throws SAXException{  
  80.         System.out.println("startDocument");  
  81.     }  
  82.   
  83.     @Override  
  84.     public void endDocument() throws SAXException{  
  85.         System.out.println("endDocument\n===================================");  
  86.         /*for(int i=0;i<rssList.size();i++){ 
  87.             RssBean tmpBean=rssList.get(i); 
  88.             System.out.println("标题:"+tmpBean.getTitle()); 
  89.             System.out.println("日期:"+tmpBean.getPubDate()); 
  90.             System.out.println("链接"+tmpBean.getLink()); 
  91.             System.out.println("语言:"+tmpBean.getLanguage()); 
  92.         }*/  
  93.     }  
  94. 这样解析就完成了.使用DOM似乎更简单些.不过它需要载入整个文档才通解析,耗费内存多些.  
  95. public void parseRss(String urlStr){  
  96.         DocumentBuilderFactory builderFactory=null;  
  97.         DocumentBuilder docBuilder=null;  
  98.         Document doc=null;  
  99.         URL url;  
  100.         try{  
  101.             url=new URL(urlStr);  
  102.             URLConnection connection=url.openConnection();  
  103.             HttpURLConnection httpURLConnection=(HttpURLConnection)connection;  
  104.             int responseCode=httpURLConnection.getResponseCode();  
  105.             if(responseCode==HttpURLConnection.HTTP_OK){  
  106.                 InputStream in=httpURLConnection.getInputStream();  
  107. builderFactory=DocumentBuilderFactory.newInstance();  
  108. docBuilder=builderFactory.newDocumentBuilder();  
  109.     //xml file 放到 assets目录中的  
  110.     //doc=docBuilder.parse(new File(url));  
  111.     doc=docBuilder.parse(in);  
  112.     //rootE element  
  113.     Element rootE=doc.getDocumentElement();  
  114.     //Do something here get a NodeList by tagname  
  115.     Element element;  
  116.     //System.out.println("channel node:"+ele);  
  117. Element channelEle=(Element)rootE.getElementsByTagName("channel").item(0);  
  118. //parseChannel(channelEle);  
  119. NodeList itemList=channelEle.getElementsByTagName("item");  
  120. int len2=itemList.getLength();  
  121. rssItemList.clear();  
  122. for(int j=0;j<len2;j++){  
  123.     element=(Element)itemList.item(j);  
  124.     RssBean rb=new RssBean();  
  125.     NodeList titleNodeList=element.getElementsByTagName("title");  
  126.     parseTitle(titleNodeList,rb);  
  127.     titleNodeList=element.getElementsByTagName("description");  
  128.     parseDescription(titleNodeList,rb);  
  129.     titleNodeList=element.getElementsByTagName("link");  
  130.     parseLink(titleNodeList,rb);  
  131.     titleNodeList=element.getElementsByTagName("pubDate");  
  132.     parsePubDate(titleNodeList,rb);  
  133.     System.out.println(rb.getTitle()+"**"+rb.getLink());  
  134.     rssItemList.add(rb);  
  135. //而这些都是简单的方法.  
  136.     System.out.println("parseRss:"+rssItemList.size());               
  137.     }  
  138. }  
  139. }catch(MalformedURLException e){  
  140.             e.printStackTrace();  
  141.         }catch(IOException e){  
  142.             e.printStackTrace();  
  143.         }catch(SAXException e){  
  144.             e.printStackTrace();  
  145.         }catch(ParserConfigurationException e){  
  146.             e.printStackTrace();  
  147.         }finally{  
  148.             doc=null;  
  149.             docBuilder=null;  
  150.             builderFactory=null;  
  151.         }  
  152.     }  
  153. //在J2Se中有GetTextContent,而这里就没有了.在文档里也写了根据节点的类型来处理getNodeValue(),节点类型为3时表示是文本节点,取之有值,其它的为Null.并且成了子节点,nodeName为#text.  
  154. private void parseTitle(NodeList titleNodeList,RssBean rb) throws DOMException{  
  155.         rb.setTitle(titleNodeList.item(0).getFirstChild().getNodeValue());  
  156.     }  
  157.   
  158.     /** 
  159.      * 处理描述 
  160.      * @param titleNodeList 节点列表 
  161.      * @param rb RssBean 
  162.      * @throws DOMException 
  163.      */  
  164.     private void parseDescription(NodeList titleNodeList,RssBean rb) throws DOMException{  
  165.         rb.setDescription(titleNodeList.item(0).getFirstChild().getNodeValue());  
  166.     }  
  167.   
  168.     /** 
  169.      * 处理链接 
  170.      * @param linkList 节点列表 
  171.      * @param rb RssBean 
  172.      * @throws DOMException 
  173.      */  
  174.     private void parseLink(NodeList linkList,RssBean rb) throws DOMException{  
  175.         rb.setLink(linkList.item(0).getFirstChild().getNodeValue());  
  176.     }  
  177.   
  178.     /** 
  179.      * 处理发布日期 
  180.      * @param titleNodeList 节点列表 
  181.      * @param rb RssBean 
  182.      * @throws DOMException 
  183.      */  
  184.     private void parsePubDate(NodeList titleNodeList,RssBean rb) throws DOMException{  
  185.         rb.setPubDate(titleNodeList.item(0).getFirstChild().getNodeValue());  
  186.     }  
posted on 2011-03-09 10:38  kitea  阅读(543)  评论(0)    收藏  举报