Sample: XmlSort
Category: cursor sample
Author: Radu Preotiuc-Pietro
Last Updated: Feb. 3, 2009

Versions:
    xmlbeans-v2

-----------------------------------------------------------------------------

This is another practical sample on how to use XmlCursor. It sorts all the
children elements of a given parent in (reverse) alphabetical order. It uses
insertion sort to minimize the number of swaps (and because it is stable) and
XmlCursor.moveXml() to perform the swaps.

The algorithm works by conceptually separating the list of children into a
sorted list and an unsorted list. Each list is represented by an XmlCursor
positioned at the head of the list. At the beginning, the sorted list
contains the first child and the unsorted list contains the rest of the
children (if any). Then, each of the elements in the unsorted list is
inserted in the already-sorted list in its appropriate place using the
moveXml() method (the text following each element is then moved along with
the element).

To build this sample, call 'ant build' and to run it against the provided
sample XML file, call 'ant run'.

To run the sample from the command line using 'java', provide as the first
parameter the name of the XML file to process and as the second argument
(optional), an XPath pointing to the element whose children are to be sorted
(by default, the children of the root element are sorted). The XPath must
evaluate to an element and one element only, otherwise an error will be
reported. The console output will mirror the input file, with the children
of the given element sorted in ascending alphabetical order.

This sample can also be used as a library routine by calling its main
static method: XmlSort.sort(XmlObject, Comparator). The XmlObject whose
children are to be sorted is passed directly as a parameter and the
Comparator defines the order in which the elements are to be sorted. The
parameters to the compare() method are two XmlCursors pointing to the
two elements to be compared. The inner class XmlSort.QNameComparator
implements comparison based on the QName of the elements (ascending or
descending) but custom comparison methods (based for instance on the
value of some attribute etc) can also be passed in.

To try out this sample:

1. Set XMLBEANS_HOME in your environment
2. Ant must be on your PATH
3. To compile the sample source, run "ant build"
4. To execute the sample, run "ant run"
