JDOMを使用して書き換えXML / DOMツリー(ConcurrentModificationExceptionが)の問題
質問
私は、JDOMツリーを歩くと私が一緒に行くように変更を加える必要があります。この時点で、変更はほとんどが今、新たな要素を追加しているだけでなく、並べ替えの要素や削除の要素を含めることができます。すべての作業は何の並行性の問題が存在しないので、同じスレッドで実行されます。
これは、あなたが横断中にノードを追加しようとJDOMのイテレータはConcurrentModificationExceptionを投げることができるので、困難であることが判明しました。私が見ることができるものから、JDOMは、直接DOMノードを結ぶのではなく、リストを使用しており、これは、それが困難な場で修正を行うことになります。
私はこれに対処する方法についての提言のカップルを見てきた、など遅らせるようトラバーサルが完了、またはトラバース木が変わらないように、その場で新しいツリーを構築されるまで追加されます。私はそれを修正するように私は、ツリーの一貫したビューを必要とするので、これらは私のために動作しません。
私は、JDOMはちょうどここに動作しないことを疑い始めています。他のJava DOMモデルのいずれかが、これが容易になりますか?またはJDOMでこれを行う方法はありますか?
解決
私は、JDOMを使用して簡単な解決策のように見えるものを作ってみました。むしろ直接JDOMイテレータを使用するよりも、私は、ノードのリストを作成し、このリストを使用してトラバースするイテレータを使用しています。このリストは「ライブ」ではありませんので、私のスクリプトは、ツリーを変更することができます(と変更を参照)トラバーサルに影響を与えず。トラバーサルは、構造変化は見られませんが、それは問題になることはありません。
他のヒント
あなたは、単に二つのパスを行うことができない理由はありますか?
ツリーを飾るとき、私は精通してるほとんどのアルゴリズムは(理想的には、あなたのアルゴリズムは、最初の装飾や装飾後の参照を解決するため、おそらく第二の合格が必要なはずです)2つの以上のトラバースを必要としません。
、あなたはこの記事ではElliotte Rusty Harold著の XOM のAPIを検討するかもしれません。それは堅実だし、無効なXML構造を作成することはできません。