I am working with Jaxb 2.x and was trying to validate XML document with the given XSD using the following tutorial
hers is the code i have written
unmarshaller.setSchema(schema);
SAXSource source = new SAXSource(new InputSource(xmlFileLocation));
Validator validator = schema.newValidator();
validator.setErrorHandler(new XMLErrorHandler<Object>());
try {
validator.validate(source);
} catch (SAXException e) {
and my XMLErrorHanlder class have following signature
public class XMLErrorHandler<T> implements ErrorHandler {
public void error(SAXParseException exception) throws SAXException {
xmlUnmarshaller.setValidationFlag(true);
log.error(
"Line:Col[" + exception.getLineNumber()
+ ":" + exception.getColumnNumber()
+ "]:" + exception.getMessage());
exception.printStackTrace();
}
}
}
code for warning and fatal has been removed now its validating the XML with XSD but it only showing the first encountered error while i want to get print on colsole all errors and warning on console
i am not sure where i am doing wrong any help in this will be helpful
Edit1 here is the portion of XSD file
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="destination" type="Destination"/>
<xs:complexType name="Destination">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="destinationID" type="xs:string" minOccurs="0"/>
<xs:element name="shortDescription" type="xs:string" minOccurs="0"/>
<xs:element name="longDescription" type="xs:string" minOccurs="0"/>
<xs:element name="stateID" type="xs:string"/>
<xs:element name="typeCode" type="xs:int"/>
<xs:element name="countryCode" type="xs:string"/>
<xs:element name="categories" type="xs:string"/>
<xs:element name="transport" type="Transport" minOccurs="0" maxOccurs="1"/>
<xs:element name="cultures" type="Cultures" minOccurs="0"/>
<xs:element name="events" type="Events" minOccurs="0" maxOccurs="1"/>
<xs:element name="placesToVisit" type="PlacesToVisit" minOccurs="0" maxOccurs="1"/>
<xs:element name="contacts" type="Contact" minOccurs="0" maxOccurs="1"/>
<xs:element name="addresses" type="address" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
and the XML file is
<destination xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="destination.xsd">
<name>Palampur</name>
<destinationID>PLP</destinationID>
<shortDescription>shortDescription</shortDescription>
<longDescription>longDescription</longDescription>
<typeCode>0</typeCode>
<categories>categories</categories>
what my assumption after doing some R&D is that there is some issue with XSD structure or the generated XML but i am not sure abt it
I assume that there might have been a fatalError
reported. You didn't provide such information in your question. If this is the case you may read the explanation of your problem in the javadoc of ErrorHandler
:
Note, however, that there is no requirement that the parser continue to report additional errors after a call to
fatalError
. In other words, a SAX driver class may throw an exception after reporting anyfatalError
.
I hope that this might explain your trouble.
Edit 1: After you posted your schema I think I know bothers you. The validator reports a single error per wrong element. In your case this is:
<xs:element name="destination" type="Destination"/>
The error will be something like (indicates missing stateID):
Error: Line:Col[7:13]:cvc-complex-type.2.4.a: Invalid content was found starting with element 'typeCode'. One of '{stateID}' is expected.
It does not report multiple errors because there is only one error report per complex type. If you change your complex type like this:
<xs:all>
You may get a different message, but again a single one:
Error: Line:Col[9:15]:cvc-complex-type.2.4.b: The content of element 'destination' is not complete. One of '{stateID, countryCode}' is expected.
If you modify your schema to accept multiple destination
elements you may get 1 error message per element then.
Cheers!