【问题标题】:SAX: XML document structures must start and end within the same entitySAX:XML 文档结构必须在同一个实体内开始和结束
【发布时间】:2013-04-03 13:17:22
【问题描述】:

我正在尝试使用javax.xml.stream.XMLStreamReader 解析(相当大的)XML 文件。这些文件格式正确(使用 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 行。

【问题讨论】:

  • 您是否尝试过使用比 JDK 中提供的更先进的 SAX 解析器?
  • 我发现一些拉式解析器非常有问题。最好的是伍德斯托克斯。

标签: java xml sax


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多