XML validation with StAX
Hi,
I have a requirement to validate XMLs during JAXB unmarshalling and during StAX parsing. The schema is packaged in a jar. I am able to successfully read the schema, and validate the XML during unmarshalling by setting the schema in the unmarshaller (through setSchema()).
However, I am not able to validate it with StAX using the same schema and same XML.
Here is the code snippet for StAX:
StringReader stringReader = new StringReader(inputXMLStr);
XMLEventReader xmlEventReader = XMLInputFactory.newInstance().createXMLEventReader(stringReader);
EventFilter filter = new EventFilter() {
public boolean accept(XMLEvent event) {
return event.isStartElement();
}
};
XMLEventReader xmlFilteredEventReader = xmlif.createFilteredReader(xmlEventReader, filter);
Schema mySchema = getSchema(); // this method retrieves the schema by reading the schema files as
stream source and calling schemaFactory.newSchema(...)
Validator validator = mySchema.newValidator();
validator.setErrorHandler(new SchemaErrorHandler());
Source xmlSource = new StAXSource(xmlFilteredEventReader);
validator.validate(xmlSource);
I get a SAX Parse exception saying "cvc-elt.1: Cannot find the declaration of element 'myElement'"
And I also see the following exception:
Caused by: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(StAXEvent2SAX.java:171)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(StAXEvent2SAX.java:118)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:651)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at com.sun.org.apache.xerces.internal.jaxp.validation.StAXValidatorHelper.validate(StAXValidatorHelper.java:89)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:114)
at javax.xml.validation.Validator.validate(Validator.java:127)
I am not able to figure out why the validation would work with UnMarshaller but not with StAX.
Any help appreciated.
Thanks
Meera