2011-12-27 93 views
0

我在我的代碼中使用下列類來解析3.43MB的巨大XML數據,並試圖將節點值檢索到哈希表中。在解析java文件中的XML文件時得到錯誤

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.xml.sax.SAXException; 

我在這裏的代碼拋出錯誤:

String nodeValue=node.getNodeValue(); 

Error is: 


Exception in thread "main" java.lang.StackOverflowError 
    at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.DeferredTextImpl.synchronizeData(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.CharacterDataImpl.getNodeValue(Unknown Source) 

即使嘗試打印數據在控制檯這樣的:

System.out.println(node.getNodeValue()); 

錯誤是這樣的:

Exception in thread "main" java.lang.StackOverflowError 
    at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.DeferredTextImpl.synchronizeData(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.CharacterDataImpl.getNodeValue(Unknown Source) 

我相信node.getNodeValue()無法讀取XML數據的某個點。
我無法擺脫這個錯誤。請幫幫我。

回答

0

你碰巧使用(無限)遞歸嗎?

或者可能是一個損壞的XML文件? (試着用你最喜歡的瀏覽器打開它)

0

一個3.4 MB的文件並不是那麼大,但是如果它包含了很多嵌套的術語,你正在使用的庫可能無法應付這種情況。例如一個HTML頁面可能有很多不匹配的標籤,這可能導致XML解析器以這種方式失敗。

例如

<html><body><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> etc 

幾百或幾千個<br>可能足以排出堆棧。

+0

@ Peter:你說什麼是有道理的,但你爲什麼會懷疑有人會用XML解析器來解析不是XML的HTML? – Cratylus 2011-12-27 10:53:34

+0

@ user384706 HTML僅僅是一個例子。任何嵌套級別過高​​的文件都可能導致使用遞歸的解析器炸燬。 – 2011-12-27 10:58:22

+0

@ Peter:我明白了。我認爲問題是不匹配的標籤而不是遞歸本身 – Cratylus 2011-12-27 11:11:59

0

至於據我所知Node.getNodeValue()不會遞歸通過。它只是打印當前節點的字符串值。這可能是數據和代碼相關的錯誤。

發佈您的代碼和XML結構(如果不是完整的xml)將有所幫助。

或者,您可以嘗試使用SAX解析器。

0

您可能只需要使用-XssSOMETHING以允許更多堆棧。如果確實存在無限遞歸,調試器會在堆棧上反覆顯示相同的內容。