[英]SAX: XML document structures must start and end within the same entity
我正在嘗試使用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行,但是大約10K行后,在4M崩潰時文件也較小(盡管發生問題的行數往往因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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.