2

我正在尝试使用javax.xml.stream.XMLStreamReader. 这些文件格式正确(使用 xmllint 验证),但我仍然收到以下异常:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[12418,95]
Message: XML document structures must start and end within the same entity.
at     com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:592)

这是我的代码的简化:

while(parser.hasNext()){
    parser.next();
    if (parser.getEventType() == XMLStreamReader.START_ELEMENT){
        if (parser.getLocalName() == "s") {
            // do stuff
        }
    }
    if (parser.getEventType() == XMLStreamReader.END_ELEMENT){
        if (parser.getLocalName() == "s") {
            // do more stuff                
        }
    }
    if (parser.getEventType() == XMLStreamReader.CHARACTERS){
        if (inSentenceElement) {
            // process text
            parser.getText()...
        }
    }
}

我已经检查了错误消息中给出的 XML 中的行/列,没有什么让我觉得不寻常。我一直认为文件的大小可能是一个问题,并且它们会被截断,以便在关闭根元素之前读取 EOF。这可行吗?如果可行,我该如何避免呢?

编辑:bz2 压缩文件的大小高达 1.5G,最多 7M 行,但在 4M 的相对较小的文件在大约 10K 行后崩溃(尽管出现问题的行数往往会因 3K 行而异.

4

1 回答 1

1
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,4207737]
Message: Attribute name "i" associated with an element type "someElement" must be followed by the ' = ' character.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:181)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:355)
    ... 49 more

实际 XML 中的属性是:index="1",所以它是有效的,但是它被截断了。相同的代码和 XML 在 Java 1.7.0u51 上工作,但在 1.7.0u71 中出现上述异常而失败。位置始终与该文件位于同一列 (CharacterOffset = 4207736)。我正在使用 JAXB,它在解组期间调用它,但除了 Java 版本之外没有任何变化。

我建议检查最近添加的一些新 XML 限制以减少拒绝服务攻击,它确实适用于我的情况。 https://docs.oracle.com/javase/tutorial/jaxp/limits/using.html

具体来说,将以下内容添加到运行的命令行会禁用所有这些。我强烈建议找到更好的限制(或导致您的问题的特定限制),而不是用 0 将它们全部关闭。

java -Djdk.xml.entityExpansionLimit=0 -Djdk.xml.elementAttributeLimit=0 -Djdk.xml.maxOccurLimit=0 -Djdk.xml.totalEntitySizeLimit=0 -Djdk.xml.maxGeneralEntitySizeLimit=0 -Djdk.xml.maxParameterEntitySizeLimit=0 -Djdk.xml.maxElementDepth=0    -jar myJarfile.jar
于 2014-12-17T18:06:52.987 回答