import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import java.io.IOException; import java.io.InputStream; import java.io.ByteArrayInputStream; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; class JdomSort { public static void main(String[] args) throws IOException, JDOMException { String xml = "" + "" + " " + " " + " " + ""; InputStream input = new ByteArrayInputStream(xml.getBytes()); SAXBuilder builder = new SAXBuilder(false); Document doc = builder.build(input); String[] rootOrder = {"elem1", "elem2"}; String[] elem1Order = {"c", "a", "b"}; String[] elem2Order = {"a", "b", "c"}; System.out.println("Starting to sort..."); Element root = doc.getRootElement(); Collections.sort(root.getChildren(), new ElementSorter(rootOrder)); Iterator iter = root.getChildren("elem1").iterator(); while (iter.hasNext()) { Element elem = (Element) iter.next(); Collections.sort(elem.getChildren(), new ElementSorter(elem1Order)); } iter = root.getChildren("elem2").iterator(); while (iter.hasNext()) { Element elem = (Element) iter.next(); Collections.sort(elem.getChildren(), new ElementSorter(elem2Order)); } XMLOutputter out = new XMLOutputter(" ", true); out.output(doc, System.out); } } class ElementSorter implements Comparator { private String[] order; public ElementSorter(String[] order) { this.order = order; } public int compare(Object o1, Object o2) { Element e1 = (Element) o1; Element e2 = (Element) o2; int index1 = indexOf(e1); int index2 = indexOf(e2); System.out.println("Comparing " + e1.getName() + " to " + e2.getName() + "; returning " + (index1 - index2)); return index1 - index2; } private int indexOf(Element e) { String name = e.getName(); for (int i = 0; i < order.length; i++) { if (order[i].equals(name)) { return i; } } return -1; } }