3

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

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

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

私の問題は、ルートノードのすべての子が2つのメソッドによって処理されるように、どのパスを指定すればよいかわからないことです。

私のxmlファイルは次のようなものです:

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

パスよりもシェフの要素を処理したい場合は、/root/chef になります。レシピ要素の場合、パスは /root/recipe になります。

しかし、dom4j が (onStart()、onEnd() で) シェフとレシピの両方の要素を処理できるようにするには、dom4j に与える必要があるパスは何ですか?

どうもありがとう!

4

2 に答える 2

2

addHandler() メソッドを呼び出す代わりに、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();
    }
}
);
于 2012-03-28T10:29:56.723 に答える
1

必要な深さのレベルに応じて、 //root/child::* または //root/descendant::* を試してください。

利用可能な xpath 軸の詳細については、 w3schoolsを参照してください。

于 2011-02-02T16:12:54.363 に答える