2011-12-27 40 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; 

ここに私のコードが投げているエラー:

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()); 

エラーがこれです:それは次のようにコンソールにデータを印刷しようとした場合でも

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) 

私はそれが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

+0

@ user384706 HTMLは単なる例です。ネストのレベルが多すぎると、再帰を使用するパーサーが爆発する可能性があります。 –

+0

@ Peter:わかりました。私は、問題はタグとは無関係で、再帰自体ではないと思っていました – Cratylus

0

私が知っている限り、Node.getNodeValue()は繰り返されません。文字列である現在のノードの値を出力するだけです。これはデータとコードに依存するエラーである可能性があります。

(完全なXMLでない場合)コードとXML構造を投稿すると役立ちます。

また、SAXパーサーを試すこともできます。

0

もっとスタックできるようにするには、おそらく-XssSOMETHINGを使用するだけです。実際に無限の再帰がある場合、デバッガは同じことを繰り返しスタックに表示します。

関連する問題