刚学android,这两天尝试在做rss阅读器
读懂了相关源码,运行也没有报错,可是得不出结果,看代码页也找不错错误,求高手不吝赐教
    private RSSFeed getFeed(String urlToRssFeed)
    {
     try
     {
     URL url=new URL(urlToRssFeed);
    
     SAXParserFactory factory=SAXParserFactory.newInstance();
    
     SAXParser parser=factory.newSAXParser();
    
     XMLReader xmlreader=parser.getXMLReader();
    
     RSSHandler theRssHandler=new RSSHandler();
    
     xmlreader.setContentHandler(theRssHandler);
    
     InputStream inPutStream = url.openStream();
            InputStreamReader inPutStreamReader= new InputStreamReader(inPutStream, "utf-8");
    
     InputSource is =new InputSource(inPutStreamReader);
    
     xmlreader.parse(is);
    
     return theRssHandler.getFeed();
     }
     catch (Exception ee)
     {
     return null;
     }
    
    }
以上是解析的部分代码,下面是handler代码,
public class RSSHandler extends DefaultHandler{
     RSSFeed _feed;
     RSSItem _item;
     String _lastElementName="";
     boolean bFoundChannel=false;
     int currentstate=0;//不感兴趣则置为0
     final int RSS_TITLE=1;
     final int RSS_LINK=2;
     final int RSS_DESCRIPTION=3;
     final int RSS_CATEGORY=4;
     final int RSS_PUBDATE=5;
     int depth=0;
     RSSHandler()
     {
     }
     RSSFeed getFeed()
     {
      return _feed;
     }
     //实现sax解析
     public void startDocument() throws SAXException
     {
     _feed= new RSSFeed();
     _item= new RSSItem();
     }
     public void endDocument() throws SAXException
     {  
     }
   
     public void startElement(String namespaceURI,String localName,String qName,Attributes atts) throws SAXException
     {
      depth++;
      if(localName.equals("channel"))
      {
      currentstate=0;
      return;
      }
      /*if(localName.equals("image"))
      {
      _feed.setTitle(_item.getTitle());
      _feed.setPubDate(_item.getPubDate());
      }*/
      if(localName.equals("item"))
      {
      _item=new RSSItem();
      return;
      }
      if(localName.equals("title"))
      {
      currentstate=RSS_TITLE;
      return;
      }
      if(localName.equals("description"))
      {
      currentstate=RSS_DESCRIPTION;
      return;
      }
      if(localName.equals("link"))
      {
      currentstate=RSS_LINK;
      return;
      }
      if(localName.equals("category"))
      {
      currentstate=RSS_CATEGORY;
      return;
      }
      if(localName.equals("pubDate"))
      {
      currentstate=RSS_PUBDATE;
      return;
      }
      currentstate=0;
     }
     public void endElement(String namespaceURI,String localName,String qName) throws SAXException
     {
      depth--;
      if(localName.equals("item"))
      {
      _feed.addItem(_item);
      return;
      }
     }
     public void characters(char ch[],int start,int length)
     {
     String theString=new String(ch,start,length);
     Log.i("RSSReader","characters["+theString+"]");
    
     switch(currentstate)
     {
     case RSS_TITLE:
     _item.setTitle(theString);
     _feed.setTitle(theString);
     currentstate=0;
     break;
     case RSS_LINK:
     _item.setLink(theString);
     currentstate=0;
     break;
     case RSS_DESCRIPTION:
     _item.setDescription(theString);
     currentstate=0;
     break;
     case RSS_CATEGORY:
     _item.setCategory(theString);
     currentstate=0;
     break;
     case RSS_PUBDATE:
     _item.setPubDate(theString);
     _feed.setTitle(theString);
     currentstate=0;
     break;
     default:
     return;
     }
     }
求解答

解决方案 »

  1.   

    代码不是很完整,你看看logcat有什么提示没,估计是网络不通
      

  2.   

    测试到url.openstream程序就不运行了,求高手解释
      

  3.   

    解析的是新浪的,是utf格式的,代码有体现
      

  4.   

    解析的网址是xml后缀的新浪网址,manifest也加入了关于internet的相关permission
      

  5.   

    InputSource is =new InputSource(url.openStream);
    这样试一下
      

  6.   

    解析的是新浪的RSS,debug发现,运行到character就不继续往下运行了,没有运行startelement函数,求高手解释。
      

  7.   

    把character函数处理内容全部注释掉,startElement函数大部分也注释掉,只留一句System.out.println("<"+qName+">"),设置断点调试发现程序依然没有执行startElement,直接执行endElement函数,继续求高手解释。
      

  8.   

    在使用characters方法时,您的操作太过于简单了,应该在发现标记结束时才能将数据写入实体类。举个例子,当一个标记内的数据量比较大时,一个标记内的数据可能要执行几次characters方法,但这几次方法里面读取的数据却应是一个元素的数据,从方法 characters(char ch[],int start,int length)
    参数可以看出,有每次读取的长度和起始位置。希望我的评论对您有所帮助
      

  9.   

      你可能还没有理解sax解析的原理,请先了解一下解析过程是怎么样的,也许你才能彻底解决这个问题
      

  10.   

    可以详细的跟我解释下characters函数的机制么,start是开始的字符,length是开始字符到有空格为止的字符之间的字符数?还是其他,感谢您的回答,从您的回答中,看的出您是个为人谦虚的智者
      

  11.   

    先粗浅的讲下我的理解,SAX是事件驱动的XML解析方式,从头到尾逐个解析XML的标签,解析到标签时触发相应的事件,解析到开始标签(<)时触发startElement时间,结束标签触发endElement事件,解析到标签之间的内容触发character事件,所以触发事件的顺序应该是STARTELEMNT-->CHARACTER-->ENDLEMNT,如此循环,这就是我很费解,STARTELEMENT事件为什么没有执行的原因,可能我的理解存在错误,请指出,谢谢