【问题标题】:Infrequent Java 6 StAX parser bug in eventReader when parsing CDATA asCharacters将 CDATA 解析为字符时,eventReader 中出现不常见的 Java 6 StAX 解析器错误
【发布时间】:2012-01-20 16:51:50
【问题描述】:

我有使用 eventReader 从 StAX 解析器获取字符的代码。代码如下所示:

private String getNextCharacters(XMLEventReader eventReader) throws XMLStreamException {
    StringBuilder characters = new StringBuilder();
    XMLEvent event = eventReader.nextEvent();

    String data = event.asCharacters().getData();
    characters.append(data);

    while (eventReader.peek() != null && eventReader.peek().isCharacters()) {
        event = eventReader.nextEvent();
        data = event.asCharacters().getData();
        characters.append(data);
    }

    return characters.toString();
}

while 循环是因为有时 asCharacters 不会在相邻的 isCharacters 事件之间合并。这似乎与是否设置 is_coalescing 标志无关。这似乎是一个合理的解决方法,但似乎引发了次要错误。有时我会看到 ]]> 附加到我的字符串中。这种情况非常少见——大约在 5000 行 XML 中出现一次,但它始终如一地发生。调试我发现当第一个事件是 CDATA 时,它发生在第二个 isCharacters 事件中。解析器似乎因第二个事件而失去了对 CDATA 指令的跟踪。

那么,有没有其他人看到这个?有没有人有比简单地从我的字符串末尾剥离 ]]> 更好的解决方法?我没有在网上或这里找到任何重要的东西。

【问题讨论】:

    标签: java xml parsing stax


    【解决方案1】:

    代替

    data = event.asCharacters().getData();
    

    你可以去

    Characters characters = event.asCharacters();
    data = characters.getData();
    
    if(characters.isCData()) {
    /* handle CDATA */
    } else if (characters.isWhiteSpace()) {
    /* handle whitespace*/
    } else if (characters.isIgnorableWhiteSpace()) {
    /* handle ignorable whitespace*/
    }
    

    HTH, 最大

    【讨论】:

    • 谢谢。这或多或少是我为解决问题所做的。对我来说,真正的问题似乎是类路径中有一个非常旧的 XML 库,它覆盖了 java 6 标准库。
    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多