How to validate XML against XSD in Java

Filed Under: Java

Java XML Validation API can be used to validate XML against XSD in java program. javax.xml.validation.Validator class is used in this program to validate xml against xsd in java.

Validate XML against XSD

Validate XML against XSD java, java xml validation, xsd validator java
Here are the sample XSD and XML files used.

Employee.xsd


<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="https://www.journaldev.com/Employee" 
xmlns:empns="https://www.journaldev.com/Employee" elementFormDefault="qualified">

	<element name="empRequest" type="empns:empRequest"></element>
	
	<element name="empResponse" type="empns:empResponse"></element>

	<complexType name="empRequest">
		<sequence>
			<element name="id" type="int"></element>
		</sequence>
	</complexType>
	
	<complexType name="empResponse">
		<sequence>
			<element name="id" type="int"></element>
			<element name="role" type="string"></element>
			<element name="fullName" type="string"></element>
		</sequence>
	</complexType>
</schema>

Notice that above XSD contains two root element and namespace also, I have created two sample XML file from XSD using Eclipse.

EmployeeRequest.xml


<?xml version="1.0" encoding="UTF-8"?>
<empns:empRequest xmlns:empns="https://www.journaldev.com/Employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.journaldev.com/Employee Employee.xsd ">
  <empns:id>5</empns:id>
</empns:empRequest>

EmployeeResponse.xml


<?xml version="1.0" encoding="UTF-8"?>
<empns:empResponse xmlns:empns="https://www.journaldev.com/Employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.journaldev.com/Employee Employee.xsd ">
  <empns:id>1</empns:id>
  <empns:role>Developer</empns:role>
  <empns:fullName>Pankaj Kumar</empns:fullName>
</empns:empResponse>

Here is another XML file that doesn’t confirms to the Employee.xsd.

employee.xml


<?xml version="1.0"?>
<Employee>
	<name>Pankaj</name>
	<age>29</age>
	<role>Java Developer</role>
	<gender>Male</gender>
</Employee>

Here is the program that is used to validate all three XML files against the XSD. The validateXMLSchema method takes XSD and XML file as argument and return true if validation is successful or else returns false.

XMLValidation.java


package com.journaldev.xml;

import java.io.File;
import java.io.IOException;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class XMLValidation {

    public static void main(String[] args) {
        
      System.out.println("EmployeeRequest.xml validates against Employee.xsd? "+validateXMLSchema("Employee.xsd", "EmployeeRequest.xml"));
      System.out.println("EmployeeResponse.xml validates against Employee.xsd? "+validateXMLSchema("Employee.xsd", "EmployeeResponse.xml"));
      System.out.println("employee.xml validates against Employee.xsd? "+validateXMLSchema("Employee.xsd", "employee.xml"));
      
      }
    
    public static boolean validateXMLSchema(String xsdPath, String xmlPath){
        
        try {
            SchemaFactory factory = 
                    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new File(xsdPath));
            Validator validator = schema.newValidator();
            validator.validate(new StreamSource(new File(xmlPath)));
        } catch (IOException | SAXException e) {
            System.out.println("Exception: "+e.getMessage());
            return false;
        }
        return true;
    }
}

Output of the above program is:


EmployeeRequest.xml validates against Employee.xsd? true
EmployeeResponse.xml validates against Employee.xsd? true
Exception: cvc-elt.1: Cannot find the declaration of element 'Employee'.
employee.xml validates against Employee.xsd? false

The benefit of using Java XML validation API is that we don’t need to parse the file and there is no third party APIs used.

Comments

  1. afsarnamak says:

    very good article. thanks

  2. Goutam Bhattacharya says:

    Hello Pankaj, This is really a good example, but the problem is the source passed to validator becomes locked. Delete operation on same file fails with exception. Could you please suggest a way out?

  3. Tóth Mihály says:

    Is there any validation for Datamatrix string content.
    I mean is there a standard combined validation with two pass?
    In the first pass is the decoding of Datamatrix content
    2nd pass: is a schema validation .

  4. Sai says:

    How can I validate the XML file if the schemaLocation is provided in the file tags.

    Thanks in advance.

  5. vinay says:

    This validation works fine field by field in top down approach like field1 comes first and field2 next,if both fields are invalid as per XSD then error will be thrown for only field1.
    I really appreciate if u can share how to validate whole XML against XSD in one shot so that all the errors will be thrown in a single response.

  6. Kannan.S says:

    what changes to make in the xsd so that the Employee.xml is valid

  7. ss says:

    Hi all,

    Please help me with this following scenario

    1 multilevel XSD(parent child) with 1 XML

    Please give me example…..

    Thanks in Advance

  8. Himanshu says:

    Hi Pankaj,

    I am having a situation where I will get some data from a Stream at run time and I need to convert it into XML by performing some general validations. I am not having any xsd ot xslt.

    Can you provide some pointers on the same.

    Thanks,
    Himanshu

  9. MAI says:

    Hi,
    I’m stuck here:

    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

    Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Lorg/apache/xerces/impl/xs/SchemaGrammar;
    Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Lorg/apache/xerces/impl/xs/XSConstraints;
    java.lang.IllegalArgumentException: http://www.w3.org/2001/XMLSchema

    Can you help me please?
    I’m using Android Studio 1.2.2, jdk 1.8, android 4.4.2

    http://stackoverflow.com/questions/31075984/android-xml-validation-using-xsd-both-xerces-and-schemafactory-error

  10. Suresh says:

    How to create the xsd in the first place. Any tools (or Eclipse menu option)available to create the xsd from xml?

    Thank you

    Suresh Kumar

  11. Bhavesh says:

    That’s what I was looking for. Thanks for sharing.

  12. Brandon says:

    Just what I was looking for, thanks!

  13. Sathish Gollapally says:

    Very good article and easy to use also……

  14. krishanveni says:

    Hi plese provide the code for the same above mentioned but not single its multiple xsd.
    So my requirement is How to Validate XML with multiple XSD Schemas.it is very urgent requirement in my project.So please give the code.And one xsd is included in other xsd and so on.So I want to validate this xml file against the multiple schemas.

    Regards
    Krishanveni

  15. Mintakastar says:

    Hi, this worked wonderfull.

    but i have a little change, what if i have the XML and XSD files, into strings?

    lets say a string read from the database, with the xml , xsd information,

    String xml =””;
    String xsd =””;

    then
    validateXMLSchema(xsd,xml)

    How do i convert the “new File” to accept the String with the data?

    or, do convert the “newSchema” and “validator.validate” to accept the String with the data?

    Schema schema = factory.newSchema(new File(xsdPath));
    validator.validate(new StreamSource(new File(xmlPath)));

    thanks!!

  16. Darko says:

    Short and clear.

    Thanks a lot for this good start-up example.

  17. Srinivas says:

    Simple and sweet. Thanks

  18. Phanendra Akurathi] says:

    Is it possible to identify all the invalid xml tags in one go?

  19. Rajesh Kumar Yuvaraj says:

    Very good and Simple solution Pankaj. Keep Going

    1. kamal says:

      With above mentioned link still i am not able to get all exception, It is throwing only single exception, Can you please let me know..It is very urgent.. In my xml i have 3-4 Enums, and if i delete all still it throws only single exception, not for all enums, can any body know the solutions. its very urgent.

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages