gpt4 book ai didi

java - SAX:XML 文档结构必须在同一实体内开始和结束

转载 作者:行者123 更新时间:2023-11-30 11:34:11 28 4
gpt4 key购买 nike

我正在尝试使用 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 行。

最佳答案

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

关于java - SAX:XML 文档结构必须在同一实体内开始和结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15788431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com