This section provides a tutorial example on how to write a DTD validator using DOM classes in JDK. The validator can validate an XML file against the specified DTD statements.
J2SDK 1.4.1_01 offers a document builder interface, javax.xml.parsers.DocumentBuilder,
to represent classes that can parse XML files into document objects described
in the Document Object Model (DOM). See my notes on DOM for more details.
The document builder also supports DTD validation during the parsing process. To do
this:
The document builder object must be set to validate DTD.
You must create your own error handler class.
The document builder object must be provided with an error handler object.
Here is a sample program, DOMValidator.java, that shows you how to use a document builder class to validate
XML files against the specified DTD statements.
/**
* DOMValidator.java
* Copyright (c) 2002 by Dr. Herong Yang
*/
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.ErrorHandler;
import org.xml.sax.helpers.DefaultHandler;
class DOMValidator {
public static void main(String[] args) {
try {
File x = new File(args[0]);
DocumentBuilderFactory f
= DocumentBuilderFactory.newInstance();
f.setValidating(true); // Default is false
DocumentBuilder b = f.newDocumentBuilder();
// ErrorHandler h = new DefaultHandler();
ErrorHandler h = new MyErrorHandler();
b.setErrorHandler(h);
Document d = b.parse(x);
} catch (ParserConfigurationException e) {
System.out.println(e.toString());
} catch (SAXException e) {
System.out.println(e.toString());
} catch (IOException e) {
System.out.println(e.toString());
}
}
private static class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException {
System.out.println("Warning: ");
printInfo(e);
}
public void error(SAXParseException e) throws SAXException {
System.out.println("Error: ");
printInfo(e);
}
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("Fattal error: ");
printInfo(e);
}
private void printInfo(SAXParseException e) {
System.out.println(" Public ID: "+e.getPublicId());
System.out.println(" System ID: "+e.getSystemId());
System.out.println(" Line number: "+e.getLineNumber());
System.out.println(" Column number: "+e.getColumnNumber());
System.out.println(" Message: "+e.getMessage());
}
}
}
See the next section on how to test this DTD validator.