Search code examples
javaxmlvalidationjaxbjaxb2

Jaxb 2.0 Schema validation problem


I am working with Jaxb 2.x and was trying to validate XML document with the given XSD using the following tutorial

Tutorial Link

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


Solution

  • 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 any fatalError.

    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!