[jdom-interest] JDOM 2 list of elements, remove nulls out entries and fails to remove?

David Wall david.wall at myeastside.com
Fri May 11 17:59:41 PDT 2012


By the way, when I changed the code to create my own "non-live" lists, 
the problem goes away and it works as expected:

List<Element> documentVersionElements = new 
LinkedList<Element>(rootElement.getChildren("DocumentVersion", ns));

But the elements I'm removing aren't nested in the XML/JDOM, so removing 
one shouldn't cause anything else to change even with a "live" view of 
the JDOM.  I suppose when I remove an Element, perhaps it moves the List 
element order for everything after it and so my live lists are then 
messed up?

Anyway, it seems that the Element's hashCode/equals works as expected in 
a regular LinkedList of Elements.


On 5/11/2012 5:42 PM, David Wall wrote:
> I believe I've run into a problem that I don't think I had with JDOM 
> 1.1.3 before I upgraded to 2.0.1.
>
> I create a list of elements of a selected element using:
>
> List<?> documentVersionElements = 
> rootElement.getChildren("DocumentVersion", ns);
>
> I see that I have 6 elements as expected in my list. None are null.
>
> I am basically then trying to find a matching related element id in 
> that list using something like:
>
>                 Element found = null;
>                 ListIterator<?> iter = 
> documentVersionElements.listIterator();
>                 while( iter.hasNext() ) {
>                     Element checkElement = (Element)iter.next();
>                     EsfUUID evParentId = new 
> EsfUUID(checkElement.getChildText("documentId", ns));
>                     if ( evParentId.equals(id) ) {
>                         found = checkElement;
>                         break;
>                     }
>                 }
>
> Then, assuming I find it (found != null), I process it as expected.  
> But I then want to remove the found element from the element list so 
> it cannot be found again, so I use this:
>
> documentVersionElements.remove(found);
>
> Most of the time, this seems to work as expected, and the 
> documentVersionElements list is then shorter by 1.  But there are 
> times when a list of 6 elements remains 6 elements after the remove 
> (and remove() returns false), with 4 of them now null (not removed, 
> but actually a null element), so in when I return to the 
> listIterator() above and get my next() element, the element is null.
>
> It's as if my Element objects are not unique in the list in terms of 
> equals/hashCode as my elements should never be nulled out.
>
> I am not sure why an element I find by iterating cannot then be 
> removed. How could it fail to remove? Why would it change other list 
> elements to NULL instead?  Is this not a valid usage pattern?
>
> Thanks,
> David


More information about the jdom-interest mailing list