1

我正在使用一些第三方 REST Web 服务。我正在做的是用 SAX 解析器解析它的响应。作为回应,我有一组<section>标签,每个标签都包含一个<text>标签和更多标签。该文本基本上是对产品的评论,因此用户可以在那里输入他喜欢的任何内容(或 ws-provider 网站上允许的内容)。<text>我在一个地方解析这个标签时遇到了问题。仅在一种情况下,只有 30 条评论的回复,它的行为很奇怪。

这是一段正在解析的xml

<text>Prachtige vormgeving. RVS/Zwart, zoals afbeelding hierbij. Even de handleiding doorlezen en daarna zeer handig in gebruik. Koffie is heerlijk. Heet water voor thee of zelfs kopje Nescafé. Cups zijn eur 0,31/0,33 per stuk. Via de site kan je een startersaanbieding met presentatiekist bestellen.&lt;br/&gt;Sommige onderdelen zijn natuurlijk heet, pas op met kinderhandjes. Kortom: zeer tevreden!!&lt;br/&gt; </text>

我已经实现org.xml.sax.helpers.DefaultHandler了我做所有事情的地方。奇怪的是为什么我的 public void characters(char[] ch, int start, int length)方法为上面的 xml 调用了两次。我调试并发现第一次使用char[] ch包含文本调用它"Prachtige vormgeving....",第二次使用空字符串调用它,导致真实文本被覆盖,因此我没有这些特定评论项目的评论文本。这是为什么?这是一个错误吗?

我做了一个额外的检查,如果我已经有了文本,那么下次忽略文本分配。所以它仍然可以正常工作。我还发现,当它第二次被调用时,qName 是一个空字符串,而第一次它是'TEXT'。(它在public void startElement(String uri, String localName, String qName, Attributes attributes)方法中)。我的 java 是 1.5_06,在 OC4J 10.1.3.5 上部署我的应用程序。

再次,问题是:这是一个错误吗?还是正常行为,我只是错过了一些有关 SAX 解析的知识?

4

1 回答 1

3

您应该累积在characters. 您描述的行为符合SAX 规范。由解析器决定何时以及如何调用该characters方法:

Parser 将调用此方法来报告每个字符数据块。SAX 解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为多个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。

这样的事情可能会有所帮助(未选中):

class MyHandler extends DefaultHandler {
    StringBuilder chars = new StringBuilder();
    ...
    private void flushCharacters() {
        char [] data = chars.toString().toCharArray();
        // use data as you want or use just chars.toString()

        chars.delete(0, chars.length());
    }

    @Override
    public void characters(char [] data, int offset, int length) {
        chars.append(char, offset, length);
    }
    ...
    // call flushCharacters in 
    // startElement/endElement/processingInstruction and wherever you want
}
于 2013-03-12T18:08:36.917 回答