2011-01-31 17 views
3

dom4jを使用して大きなxmlファイルを解析したいと思います。私は気にしない要素を無視するためのパス式のイベントハンドラを登録することができるdom4jの機能を使用しています。この機能については、http://dom4j.sourceforge.net/dom4j-1.6.1/faq.html#large-docで説明します。dom4jでXMLパスを指定

私はそこから引用します: "これらのハンドラは、特定のハンドラに対して登録された各パスの開始時と終了時に呼び出されます。 pathの終了タグが見つかった場合、そのパスに登録されているハンドラのonEndメソッドが呼び出されます。

onStartメソッドとonEndメソッドには、ElementPathのインスタンスが渡されます。メモリ使用を節約するためにハンドラが構築中のツリーを「プルーニング」したい場合、ハンドラonEnd()メソッドで処理中の現在のElementのdetach()メソッドを単に呼び出すことができます。 "

私の問題は、ルートノードのすべての子が2つの方法で処理されるように、どのようなパスを与えるべきかわかりません。私は、パスよりもシェフの要素を処理したい場合は/ルート/シェフになり

<root .....> 
    <chef name="" ..../> 
    <chef name="" ..../> 
    <recipe name = .... /> 
    <recipe name...../> 
    .... 

私のxmlファイルは次のようなものです。 レシピエレメントの場合、パスは/ root/recipeになります。

しかし、シェルフとレシピの両方の要素(onStart()、onEnd())を処理するためにdom4jに渡すべきパスは何ですか?

ありがとうございます!

+0

dom4jのは、理想的には、大のために適していませんXMLファイルは、ここに証拠ですhttp://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf –

答えて

1

あなたが望む奥行きレベルに応じて// root/child :: *または// root/descendant :: *を試してみてください。

利用できるのXPathの詳細についてw3schoolsが代わりにはaddHandler()メソッドを呼び出すの

2

を軸、(setDefaultHandlerを呼び出し参照)、このようにそれを使用します。

SAXReader reader = new SAXReader(); 
reader.setDefaultHandler(
new ElementHandler() { 
    public void onStart(ElementPath path) { 
     // If needed, similar to onEnd, but don't detach.  
    } 
    public void onEnd(ElementPath path) { 
     Element parent = path.getCurrent().getParent(); 
     if(parent != null && "/root".equals(parent.getPath()) { 
      // Do whatever 
     } 

     path.getCurrent().detach(); 
    } 
} 
); 
関連する問題