Paul Paul - 6 months ago 29
Java Question

In Java, how do I parse an xml schema (xsd) to learn what's valid at a given element?


I'd like to be able to read in an XML schema (i.e. xsd) and from that know what are valid attributes, child elements, values as I walk through it.

For example, let's say I have an xsd that this xml will validate against:

<root>
<element-a type="something">
<element-b>blah</element-b>
<element-c>blahblah</element-c>
</element-a>
</root>


I've tinkered with several libraries and I can confidently get
<root>
as the root element. Beyond that I'm lost.

Given an element I need to know what child elements are required or allowed, attributes, facets, choices, etc. Using the above example I'd want to know that
element-a
has an attribute
type
and may have children
element-b
and
element-c
...or must have children
element-b
and
element-c
...or must have one of each...you get the picture I hope.

I've looked at numerous libraries such as XSOM, Eclipse XSD, Apache XmlSchema and found they're all short on good sample code. My search of the Internet has also been unsuccessful.

Does anyone know of a good example or even a book that demonstrates how to go through an XML schema and find out what would be valid options at a given point in a validated XML document?

clarification

I'm not looking to validate a document, rather I'd like to know the options at a given point to assist in creating or editing a document. If I know "I am here" in a document, I'd like to determing what I can do at that point. "Insert one of element A, B, or C" or "attach attribute 'description'".

Answer

Many of the solutions for validating XML in java use the JAXB API. There's an extensive tutorial available here. The basic recipe for doing what you're looking for with JAXB is as follows:

  1. Obtain or create the XML schema to validate against.
  2. Generate Java classes to bind the XML to using xjc, the JAXB compiler.
  3. Write java code to:
    1. Open the XML content as an input stream.
    2. Create a JAXBContext and Unmarshaller
    3. Pass the input stream to the Unmarshaller's unmarshal method.

The parts of the tutorial you can read for this are:

  1. Hello, world
  2. Unmarshalling XML