SAX解析xml问题,求解答
刚学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;
}
}
求解答 --------------------编程问答-------------------- 代码不是很完整,你看看logcat有什么提示没,估计是网络不通 --------------------编程问答-------------------- 谢谢,我先测试下 --------------------编程问答-------------------- 测试到url.openstream程序就不运行了,求高手解释 --------------------编程问答-------------------- xml必须是utf-8格式 --------------------编程问答-------------------- 解析的是新浪的,是utf格式的,代码有体现 --------------------编程问答-------------------- 解析的网址是xml后缀的新浪网址,manifest也加入了关于internet的相关permission --------------------编程问答-------------------- InputSource is =new InputSource(url.openStream);
这样试一下
--------------------编程问答-------------------- --------------------编程问答-------------------- 解析的是新浪的RSS,debug发现,运行到character就不继续往下运行了,没有运行startelement函数,求高手解释。 --------------------编程问答-------------------- 把character函数处理内容全部注释掉,startElement函数大部分也注释掉,只留一句System.out.println("<"+qName+">"),设置断点调试发现程序依然没有执行startElement,直接执行endElement函数,继续求高手解释。。。。 --------------------编程问答-------------------- 在使用characters方法时,您的操作太过于简单了,应该在发现标记结束时才能将数据写入实体类。举个例子,当一个标记内的数据量比较大时,一个标记内的数据可能要执行几次characters方法,但这几次方法里面读取的数据却应是一个元素的数据,从方法 characters(char ch[],int start,int length)
参数可以看出,有每次读取的长度和起始位置。希望我的评论对您有所帮助 --------------------编程问答--------------------
你可能还没有理解sax解析的原理,请先了解一下解析过程是怎么样的,也许你才能彻底解决这个问题 --------------------编程问答-------------------- 可以详细的跟我解释下characters函数的机制么,start是开始的字符,length是开始字符到有空格为止的字符之间的字符数?还是其他,感谢您的回答,从您的回答中,看的出您是个为人谦虚的智者。。。 --------------------编程问答-------------------- 先粗浅的讲下我的理解,SAX是事件驱动的XML解析方式,从头到尾逐个解析XML的标签,解析到标签时触发相应的事件,解析到开始标签(<)时触发startElement时间,结束标签触发endElement事件,解析到标签之间的内容触发character事件,所以触发事件的顺序应该是STARTELEMNT-->CHARACTER-->ENDLEMNT,如此循环,这就是我很费解,STARTELEMENT事件为什么没有执行的原因,可能我的理解存在错误,请指出,谢谢 --------------------编程问答-------------------- 求解答求解答求解答。 --------------------编程问答-------------------- 求解答 --------------------编程问答-------------------- --------------------编程问答-------------------- 11楼说得很好
补充:移动开发 , Android