2009-02-26 4 views
1

私はJDOMツリーを歩いて行ってください。現時点では、変更は主に新しい要素を追加していますが、要素を並べ替えたり、要素を削除したりすることもできます。すべての作業は同じスレッドで行われるため、並行性の問題はありません。JDOM(ConcurrentModificationException)を使用したXML/DOMツリー書き換えの問題

これは、トラバーサル中にノードを追加しようとすると、JDOMイテレータがConcurrentModificationExceptionをスローする可能性があるため、難しいことが分かります。私が見るところでは、JDOMはDOMノードを直接リンクするのではなくリストを使用しています。

トラバーサルが完了するまで追加を延期するなど、対処方法に関するいくつかの推奨事項を見てきました。トラバーしたツリーが変更されないように新しいツリーをオンザフライで構築するなどです。私はそれを変更すると木の一貫性のあるビューが必要なので、これらは私のためには機能しません。

私はJDOMがここではうまく動作しないと考え始めています。これを他のJava DOMモデルでも簡単に行うことができますか?それともJDOMでこれを行う方法はありますか?

答えて

3

JDOMを使用した簡単なソリューションのように見えます。 JDOMイテレータを直接使用するのではなく、イテレータを使用してノードのリストを作成し、このリストを使用してトラバースします。このリストは「ライブ」ではないので、スクリプトはトラバーサルに影響を与えずにツリーを変更し(そして変更を見ることができます)。トラバーサルには構造的な変更は見られませんが、それは問題ではありません。

0

単純に2回のパスができない理由はありますか?

私がよく知っているほとんどのアルゴリズムは、ツリーをデコレートするときに2回以上のトラバーサルを必要としません(理想的には、アルゴリズムは初期装飾のパスを必要とし、装飾後の参照を解決するためには2番目のアルゴリズムが必要です)。

+0

うまくいくとは思わないでください。私は各ノードで変換を定義する機能を提供しており、スクリプトモデルでは変換中に残りのツリーを調べることができます。あらゆる種類の遅延更新は、スクリプト作成者がこれに対処する必要があることを意味します。 – jdigital

+0

JDOMノード(要素)を装飾するためにどのようなテクニックを提案しますか? – jdigital

0

あなたは他のモデルを使用しているので、Elliotte Rusty HaroldのXOM APIを参考にしてください。それは堅実であり、無効なXML構造を作成することはできません。

+0

このタスクを処理できますか? – jdigital

+0

はい。イテレーターを公開しないので、同時変更例外が発生する可能性はありません。子ノードのトラバーサルはノードインデックスによって行われます。 – erickson