【问题标题】:SAX parser issueSAX 解析器问题
【发布时间】:2010-12-22 17:39:06
【问题描述】:

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

我的 chars 方法如下所示:

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>"));

        }

当它碰到它时程序就会停止。

提前感谢您的帮助!!! -大卫

【问题讨论】:

  • 我刚刚粘贴的子字符串代码与我实际运行的代码混淆了,我实际上创建了一个新字符串 thisString 并将其传递给 theString 而不是 ch...
  • 我认为我不相信 Log Cat 转储。解析器真的将“South Korea...”更改为“SKorea...”还是 XML 中的内容更多?
  • @Brandon:为什么不打开实际的 XML 文档,看看它的结构?这可能有助于你理解。看起来好像“title”元素包含 SKorea,而不是描述。
  • 是的,我完全失明了。没有看到信息/标题。实际的 XML 文档在哪里?
  • 这是正确的,标题标签与描述标签不同,我记录了两者,因此我可以参考应该存在的描述。

标签: java android rss sax


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你没有解释ch 是如何设置的,所以很难知道发生了什么。不过,这是我有根据的猜测:

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

    【讨论】:

    • public void characters(char ch[], int start, int length)
    • 对不起,ch 是传递给公共 void 字符的字符数组。
    • 哦,它们是由 rss 对象的向量处理的,因此它们是连接在一起的。
    • @david 我不知道您所说的“它们正在由 rss 对象的向量处理”是什么意思。从您发布的一小段代码看来,您正在调用_item.setDescription(theString),其中theString 只是传递给characters 事件处理程序方法的字符。假设setDescription 符合其名称的含义,那就错了。您想附加到描述,而不是设置它。如果您仍需要帮助,请发布更多代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多