我正在为特定的RSS提要开发RSS提要阅读器,我遇到了SAX和标签的问题。标签看起来像这样
<description>
<![CDATA[<img src=http://www.lamaruniversitypress.com/polopoly_fs/1.1832584!image/2678128836.jpg_gen/thumbnails/100x100/2678128836.jpg><br /><br><p>
South Korea vowed Wednesday to completely punish North Korea if it attacks again.
...</p>]]>
</description>
我的startElement方法有这个元素来处理描述标记,如下所示:
if (localName.equals("description"))
{
currentstate = RSS_DESCRIPTION;
return;
}
我的字符方法如下:
case RSS_DESCRIPTION:
_item.setDescription(theString);
Log.i("DESCRIPTION","characters[" + theString + "]");
currentstate = 0;
break;
日志文件显示:
12-22 11:21:06.517: INFO/TITLE(489): characters[SKorea holds massive new drills after North attack]
12-22 11:21:06.527: INFO/DESCRIPTION(489): characters[
12-22 11:21:06.527: INFO/DESCRIPTION(489): ]
这是我第一次尝试使用SAX,而且我已经非常接近用不同的解析器重写整个事情了,问你们这是我最后的努力。
我尝试过处理段落标记,但这不起作用,大概是因为它在CDATA内部。我试图像这样对
这样的描述进行子串String theString = new String(ch,start,length);
/*
if ( currentstate == RSS_DESCRIPTION){
theString = new String(ch, theString.indexOf("<p>") + 3, theString.indexOf("</p>"));
}
并且程序在它命中时就停止了。
提前感谢您的帮助!!! -David
答案 0 :(得分:2)
您不应重置currentState
标志,因为SAX解析器会逐块调用characters
方法。当第一个块重置标志时,即将出现的字符将不会以相同的方式处理。
您可以将char数组附加到StringBuilder
,然后在任何startElement
,endElement
,processingInstruction
事件中将其刷新。
答案 1 :(得分:1)
您没有解释ch
是如何设置的,所以要知道发生了什么有点困难。不过,这是我受过教育的猜测:
如果实体引用或CDATA部分之类的内容出现在其中,则许多(如果不是全部)SAX解析器会将字符数据分解为单独的事件。看起来你只是处理来自单个事件的文本。你想将它们连接在一起。