<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2655.35">
<TITLE>RE: [jdom-interest] Moving elements </TITLE>
</HEAD>
<BODY>

<P><FONT SIZE=2>I have used the following code in the past .....</FONT>
</P>

<P><FONT SIZE=2>Basically, because DTD's are cumbersome if the child elements are not in a particular order, I wrote the following code to re-order the child elements to conform to the expected order of the DTD. Does both of your criteria, detatch, re-order. It is memory-hungry in the sense that it is recursive, and the memory is kept during recursion. The &quot;plus&quot; side for me is that it reorders just the elements, and any &quot;mixed&quot; content is left in the same order. This is obviously application specific, so YMMV.</FONT></P>

<P><FONT SIZE=2>Rolf</FONT>
</P>

<P><FONT SIZE=2>&nbsp;&nbsp;&nbsp; private static void reorderElements (Element element, Comparator comp) {</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (element.getChildren().isEmpty()) return;</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Try to do the whole thing without a clone... Use detach only.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkedList list = new LinkedList();</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkedList kids = new LinkedList();</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List content = element.getContent();</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!content.isEmpty()) {</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // This removes and detaches element.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object o = content.remove(0);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // add the detached object to our list, in same order.</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(o);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // add to our list of kids, if element</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (o instanceof Element) kids.add(o);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collections.sort(kids, comp);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; list.size(); i++) {</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (list.get(i) instanceof Element) {</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element rep = (Element)kids.remove(0);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reorderElements(rep, comp);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.set(i,rep);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.setContent(list);</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp; }</FONT>
</P>

<P><FONT SIZE=2>-----Original Message-----</FONT>
<BR><FONT SIZE=2>From: Bradley S. Huffman [<A HREF="mailto:hip@a.cs.okstate.edu">mailto:hip@a.cs.okstate.edu</A>]</FONT>
<BR><FONT SIZE=2>Sent: Thursday, May 01, 2003 12:00 AM</FONT>
<BR><FONT SIZE=2>To: Jason Hunter</FONT>
<BR><FONT SIZE=2>Cc: jdom-interest@jdom.org</FONT>
<BR><FONT SIZE=2>Subject: Re: [jdom-interest] Moving elements </FONT>
</P>
<BR>

<P><FONT SIZE=2>Jason Hunter writes:</FONT>
</P>

<P><FONT SIZE=2>&gt; 2) We could have a new method like this on Element and Document:</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp; List element.getContentDetached()</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; It would return a list of the detached content.&nbsp; Then you could do this:</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; heading.setContent(anchorList.getContentDetached());</FONT>
</P>

<P><FONT SIZE=2>Definitely +1, but I'd just go ahead and name it removeContent().</FONT>
</P>

<P><FONT SIZE=2>&gt; 3) We could change the add semantics.&nbsp; David Flanagan suggested this,</FONT>
<BR><FONT SIZE=2>&gt; and it's how DOM does things.&nbsp; If you add an element somewhere and the</FONT>
<BR><FONT SIZE=2>&gt; element already has a parent, the new parent just trumps it.&nbsp; Compare</FONT>
<BR><FONT SIZE=2>&gt; that to right now we throw an IllegalAddException.&nbsp; If we changed</FONT>
<BR><FONT SIZE=2>&gt; behaviors, it would make nice code:</FONT>
</P>

<P><FONT SIZE=2>Better documentation is also a solution :) But if the remove/add sequence is</FONT>
<BR><FONT SIZE=2>not convenient enough, I'd prefer a moveContent(...) on Element instead of</FONT>
<BR><FONT SIZE=2>changing the add semantics.</FONT>
</P>

<P><FONT SIZE=2>&nbsp;&nbsp;&nbsp; heading.moveContent(textNode); // Move textNode to end of heading's</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // content list.</FONT>
</P>

<P><FONT SIZE=2>&gt; heading.setContent(anchorList.getContent());</FONT>
</P>

<P><FONT SIZE=2>Hmmm, does that a) detach the content from anchorList or b) make</FONT>
<BR><FONT SIZE=2>a copy of anchorList before setting heading's content.&nbsp; It's not clear just</FONT>
<BR><FONT SIZE=2>by looking at it. I like</FONT>
</P>

<P><FONT SIZE=2>&nbsp;&nbsp;&nbsp; heading.setContent(anchorList.removeContent());</FONT>
</P>

<P><FONT SIZE=2>&gt; Sorting works naturally also.&nbsp; The big issue is whether you expect this</FONT>
<BR><FONT SIZE=2>&gt; sort of auto-detachment.&nbsp; I guess I wouldn't, but maybe I've used JDOM</FONT>
<BR><FONT SIZE=2>&gt; too long.&nbsp; :-)</FONT>
</P>

<P><FONT SIZE=2>I wouldn't either,&nbsp; and besides</FONT>
</P>

<P><FONT SIZE=2>&nbsp;&nbsp;&nbsp; List list = anchorList.removeContent();</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp; // do the sort</FONT>
<BR><FONT SIZE=2>&nbsp;&nbsp;&nbsp; heading.setContent(list);</FONT>
</P>

<P><FONT SIZE=2>is very clear about what is actual being done.</FONT>
</P>

<P><FONT SIZE=2>Brad</FONT>
<BR><FONT SIZE=2>_______________________________________________</FONT>
<BR><FONT SIZE=2>To control your jdom-interest membership:</FONT>
<BR><FONT SIZE=2><A HREF="http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com" TARGET="_blank">http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com</A></FONT>
</P>

</BODY>
</HTML>