2009-02-26 6 views
1

JDOM 트리를 따라 가면서 변경해야합니다. 이 시점에서 변경 사항은 주로 새 요소를 추가하는 것이지만 요소를 재정렬하거나 요소를 제거하는 것도 포함 할 수 있습니다. 모든 작업은 동일한 스레드에서 수행되므로 동시성 문제는 없습니다.JDOM (ConcurrentModificationException)을 사용하여 XML/DOM 트리 재 작성시의 문제

이것은 탐색하는 동안 노드를 추가하려고하면 JDOM 반복기가 ConcurrentModificationException을 throw 할 수 있기 때문에 어렵다는 것을 알 수 있습니다. 내가 볼 수 있듯이, JDOM은 DOM 노드를 직접 연결하는 대신 목록을 사용하기 때문에 수정 작업을 즉시 수행 할 수 없습니다.

트래버스가 완료 될 때까지 추가를 연기하거나 트래버스 된 트리가 변경되지 않도록 즉석에서 새 트리를 작성하는 것과 같이이를 처리하는 방법에 대한 몇 가지 권장 사항을 살펴 보았습니다. 트리를 수정하면서 일관성있는 트리 뷰가 필요하기 때문에 이것들은 저에게 효과적이지 않을 것입니다.

JDOM이 여기서 제대로 작동하지 않을 것으로 생각됩니다. 다른 Java DOM 모델을 사용하면이 작업을 더 쉽게 수행 할 수 있습니까? 아니면 JDOM에서이 작업을 수행 할 수있는 방법이 있습니까?

답변

3

저는 JDOM을 사용하는 쉬운 솔루션처럼 보입니다. 직접 JDOM 반복자를 사용하는 대신 반복자를 사용하여 노드 목록을 만든 다음이 목록을 사용하여 트래버스합니다. 이 목록은 "라이브"가 아니기 때문에 내 스크립트는 순회에 영향을주지 않고 트리를 수정 (변경 사항을 볼 수 있음) 할 수 있습니다. 순회는 구조적인 변화를 볼 수 없지만 문제가되어서는 안됩니다.

0

단순히 두 번의 패스를 할 수없는 이유가 있습니까?

익숙한 대부분의 알고리즘은 트리를 장식 할 때 2 회 이상의 탐색을 필요로하지 않습니다 (이상적으로 알고리즘은 초기 장식을위한 패스가 필요하고 장식 후 참조를 해결하기위한 초).

+0

잘 작동한다고 생각하지 마십시오. 각 노드에서 변환을 정의 할 수있는 기능을 제공하고 있으며 스크립팅 모델을 사용하면 변형 중에 나머지 트리를 검사 할 수 있습니다. 어떤 종류의 지연된 업데이트는 스크립트 작성자가이를 처리해야 함을 의미합니다. – jdigital

+0

JDOM 노드 (요소)를 꾸미기 위해 어떤 기술을 제안 하시겠습니까? – jdigital

0

다른 모델을 사용할 수 있으므로 Elliotte Rusty Harold의 XOM API를 고려해보십시오. 그것은 단단한 바위, 그리고 당신이 잘못된 XML 구조를 만들 수 없습니다.

+0

이 작업을 처리 할 수 ​​있습니까? – jdigital

+0

예; iterators를 노출시키지 않으므로 동시 수정 예외가 발생할 가능성은 없습니다. 하위 노드 순회는 해당 노드 색인을 기준으로합니다. – erickson