Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to validate xml against xsd and get *ALL* errors?

I have a standard code like below to validate xml against xsd, but it throw exception on first error and stops. How to validate xml, but continue on the first and next errors and get them all at the end ? Is it even possible ?

public static void validate(File xml, InputStream xsd) {     try {         SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);         Schema schema = factory.newSchema(new StreamSource(xsd));         Validator validator = schema.newValidator();         StreamSource xmlFile = new StreamSource(xml);         validator.validate(xmlFile);      } catch (SAXException e) {         e.printStackTrace();     } catch (IOException e) {         e.printStackTrace();     } } 
like image 363
marioosh Avatar asked Jun 21 '12 04:06

marioosh


People also ask

How do I check XML errors?

To install the XML tools plugin, download the plugin zip file, and extract the contents to where you have installed Notepad++ (such as C:\Program Files\Notepad++). Then restart Notepad++, open the XML file you wish to check, click on the "Plugins" menu at the top, select "XML Tools" and click on "Check XML syntax now."

What is XSD validation error?

The schema is defined by the XSD. Schema errors occur where there is a problem with the structure or order of the file, or an invalid character is included. Schema errors prevent the validation being run in full because the file cannot be read. This means that errors cannot be traced to a particular record.

Can we validate XML documents against so schema?

You can validate your XML documents against XML schemas only; validation against DTDs is not supported. However, although you cannot validate against DTDs, you can insert documents that contain a DOCTYPE or that refer to DTDs.


1 Answers

Between Validator validator = schema.newValidator(); and StreamSource xmlFile = new StreamSource(xml); add this fragment:

  final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();   validator.setErrorHandler(new ErrorHandler()   {     @Override     public void warning(SAXParseException exception) throws SAXException     {       exceptions.add(exception);     }      @Override     public void fatalError(SAXParseException exception) throws SAXException     {       exceptions.add(exception);     }      @Override     public void error(SAXParseException exception) throws SAXException     {       exceptions.add(exception);     }   }); 

This way, after validate() you'll get full list of exceptions, but if one fatal error occurs, the parsing stops...

EDIT: the JavaDoc says: The application must assume that the document is unusable after the parser has invoked this method, and should continue (if at all) only for the sake of collecting additional error messages: in fact, SAX parsers are free to stop reporting any other events once this method has been invoked. So fatalError() may or may not cause the parsing to stop.

like image 98
Grzegorz Grzybek Avatar answered Sep 22 '22 07:09

Grzegorz Grzybek