- From: Miles Sabin <msabin@cromwellmedia.co.uk>
- Date: Fri, 13 Nov 1998 16:46:09 -0000
- To: "'John Cowan'" <cowan@locke.ccil.org>, "'DOM list'" <www-dom@w3.org>
John Cowan wrote, > Miles Sabin wrote: > > > OK, I agree that this check is O(1). However, that's only > > because the granularity of the check is so coarse: a single > > document-level timestamp will cause a lot of unnecessary > > invalidation ... > > Agreed. But this isn't so important if there are few active > iterators (= iterators that will ever be resumed), which was my > point. > > > I suspect that it would make the performance > > of modifying a document via iterators unacceptably poor. > > Here I think the JDK 1.2 java.util.Iterator class is useful: it has > a "remove" method which removes the last element iterated to > in a safe way, or raises an exception if the underlying > container is read-only. Hmm ... I'm afraid I don't think this will be good enough. Sure it solves the following problem, Iterator i = element.???(); while(i.hasMore()) { Node node = (Node)i.next(); node.getParentNode().removeChild(node); // correct, but invalidates // iterator, so poor performance } but that's only one way we might want to use iterators to modify the structure of a document. How about something like this, Iterator i = elementA.???(); Iterator j = elementB.???(); while(i.hasMore() && j.hasMore()) { Node nodeA = i.next(); Node nodeB = j.next(); if(nodeA.getNodeType() == Node.ELEMENT_NODE && nodeB.getNodeType() == Node.ELEMENT_NODE) { Element elementA = (Element)nodeA; Element elementB = (Element)nodeB; if(elementA.getAttribute("foo").equals(elementB.getAttribute("foo" )) elementB.getParentNode().removeChild(elementB); } (run through the iterators and remove corresponding elements with duplicated foo attributes ... OK, a bit artificial I know, but I'm sure someone can come up with a more realistic case). Even with a remove() operation on the iterator class, this will still cause serious problems, because i will be invalidated every time a node is removed via j. Cheers, Miles -- Miles Sabin Cromwell Media Internet Systems Architect 5/6 Glenthorne Mews +44 (0)181 410 2230 London, W6 0LJ msabin@cromwellmedia.co.uk England
Received on Friday, 13 November 1998 11:48:13 UTC