簡體   English   中英

SAX:XML文檔結構必須在同一實體內開始和結束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM