2013-04-03 57 views
2

我試圖使用javax.xml.stream.XMLStreamReader解析(相當大)的XML文件。都能很好地形成的文件(xmllint驗證的),但我仍然得到以下異常:SAX:XML文檔結構必須在同一實體內開始和結束

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出現相對較小的文件(儘管問題發生後的行數趨於變化通過

+0

把它們全部關閉您是否嘗試過使用更多最新的SAX解析器比提供的一個JDK? – artbristol

+0

我發現了一些pull解析器非常麻煩。最好的一個是Woodstox。 –

回答

0
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 

一些3K線在實際的XML屬性是:指數=「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 
相關問題