Using latest JAXB (Sun) and have a hierarchy of schemas that use import directives between schemas to share type definitions. Schema validation is activated on the setSchema call to Marshaller/Unmarshaller in JAXB which should defer validation to Xerces (using Java 1.5). I don't want to know the order of import directives between schemas when creating the Schema object with SchemaFactory. Unfortunately, I haven't found a Xerces feature/property that allows for this. For example, if a.xsd is pulled into b.xsd with an import then the following code doesn't work:
FileInputStream a = new FileInputStream("a.xsd");
FileInputStream b = new FileInputStream("b.xsd");
Schema schema = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
new Source[] {
new StreamSource(b),
new StreamSource(a)
}
);
The order of the Source array has to be a.xsd then b.xsd. Any way around this?
What if you create a schema on the root Source, and then set a ResourceResolver (LSResourceResolver) to resolve the other imported schemas during the schema creation.
Late post of the code.
Generate a validation Schema with:
The Schema (schemaGrammers object) gets injected into the Marshaller:
And the SimpleResolver implements the LSResourceResolver class:
A new input stream has to be created otherwise a conflict occurs. Not sure why (didn't bother to debug the code) but the streams I pass to the constructor [ie. the Set object] have already been read.