Say I have an XML document (represented as text, a W3C DOM, whatever), and also an XML Schema. The XML document has all the right elements as defined by the schema, but in the wrong order.
How do I use the schema to "re-order" the elements in the document to conform to the ordering defined by the schema?
I know that this should be possible, probably using XSOM, since the JAXB XJC code generator annotates its generated classes with the correct serialization order of the elements.
However, I'm not familiar with the XSOM API, and it's pretty dense, so I'm hoping one of you lot has some experience with it, and can point me in the right direction. Something like "what child elements are permitted inside this parent element, and in what order?"
Let me give an example.
I have an XML document like this:
<A>
<Y/>
<X/>
</A>
I have an XML Schema which says that the contents of <A>
must be an <X>
followed by a <Y>
. Now clearly, if I try to validate the document against the schema, it fails, since the <X>
and <Y>
are in the wrong order. But I know my document is "wrong" in advance, so I'm not using the schema to validate just yet. However, I do know that my document has all of the correct elements as defined by the schema, just in the wrong order.
What I want to do is to programmatically examine the Schema (probably using XSOM - which is an object model for XML Schema), and ask it what the contents of <A>
should be. The API will expose the information that "you need an <X>
followed by a <Y>
".
So I take my XML document (using a DOM API) and re-arrange and accordingly, so that now the document will validate against the schema.
It's important to understand what XSOM is here - it's a java API which represents the information contained in an XML Schema, not the information contained in my instance document.
What I don't want to do is generate code from the schema, since the schema is unknown at build time. Furthermore, XSLT is no use, since the correct ordering of the elements is determined solely by the data dictionary contained in the schema.
Hopefully that's now explicit enough.