Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to validate xml with dtd using java?

Tags:

java

xml

dtd

I have following xml file:

<?xml version = "1.0" ?>
<Employee>
    <Emp_Id>E-001</Emp_Id>
    <Emp_Name>Vinod</Emp_Name>
    <Emp_E-mail>[email protected]</Emp_E-mail>
</Employee>

I have following dtd file:

<!ELEMENT Employee (Emp_Id, Emp_Name, Emp_E-mail)>
<!ELEMENT Emp_Id (#PCDATA)>
<!ELEMENT Emp_Name (#PCDATA)>
<!ELEMENT Emp_E-mail (#PCDATA)>

I want to validate this xml file with above dtd using java.

Please, help thanks..:-)

like image 460
Sachin J Avatar asked Jan 02 '12 10:01

Sachin J


People also ask

How does XML validation work?

XML validation is the process of checking a document written in XML (eXtensible Markup Language) to confirm that it is both well-formed and also "valid" in that it follows a defined structure. A well-formed document follows the basic syntactic rules of XML, which are the same for all XML documents.

Can we validate XML schema?

You can validate your XML documents against XML schemas only; validation against DTDs is not supported.


2 Answers

There are three things you should do:

  • Associate the source XML document with its DTD using a doctype declaration after the XML declaration:

    <!DOCTYPE Employee SYSTEM "employee.dtd">
    

    Note: The DOCTYPE root must match the root element in the source XML.

  • setValidating to true on the DocumentBuilderFactory

  • Provide an org.xml.sax.ErrorHandler instance to the DocumentBuilder using setErrorHandler

Here's a complete example:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setValidating(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
builder.setErrorHandler(new ErrorHandler() {
    @Override
    public void error(SAXParseException exception) throws SAXException {
        // do something more useful in each of these handlers
        exception.printStackTrace();
    }
    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        exception.printStackTrace();
    }

    @Override
    public void warning(SAXParseException exception) throws SAXException {
        exception.printStackTrace();
    }
});
Document doc = builder.parse("employee.xml");

Source document:

<?xml version="1.0"?>
<!DOCTYPE Employee SYSTEM "employee.dtd">
<Employee>
    <Emp_Id> E-001</Emp_Id>
    <Emp_Name> Vinod </Emp_Name>
    <Emp_E-mail> [email protected] </Emp_E-mail>
</Employee>
like image 73
Wayne Avatar answered Oct 16 '22 01:10

Wayne


You just need to read the files and report the exceptions, if any. Here is a SAX parser example you can rely upon.

In order to validate your XML and DTD you just need to setValidating:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(true); // since the default value is false

Also declare the DTD usage in your XML file:

<?xml version="1.0"?>
<!DOCTYPE Employee SYSTEM "employee.dtd">
<Employee>
like image 31
Costis Aivalis Avatar answered Oct 16 '22 00:10

Costis Aivalis