SAX解析器问题

时间:2010-12-22 17:39:07

标签: java android rss sax

我正在为特定的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

2 个答案:

答案 0 :(得分:2)

您不应重置currentState标志,因为SAX解析器会逐块调用characters方法。当第一个块重置标志时,即将出现的字符将不会以相同的方式处理。

您可以将char数组附加到StringBuilder,然后在任何startElementendElementprocessingInstruction事件中将其刷新。

答案 1 :(得分:1)

您没有解释ch是如何设置的,所以要知道发生了什么有点困难。不过,这是我受过教育的猜测:

如果实体引用或CDATA部分之类的内容出现在其中,则许多(如果不是全部)SAX解析器会将字符数据分解为单独的事件。看起来你只是处理来自单个事件的文本。你想将它们连接在一起。