Some XML documents have type definitions described as standard, e.g XML schemas or XML stylesheets. DTD-files for them are completely predefined and are stored on W3C host.

For such documents, SAX-parser can avoid references through Internet by using a local copy of DTD-file. In order to perform such substitutions, SAX suggests mechanism of enity resolving. A handler below shows its usage:

<!-- file: purchase-order.dtd -->

<!-- declaration of the root element and its attributes -->
<!ELEMENT purchase-order (purchased-by, order-items)>
<!ATTLIST purchase-order

<!ELEMENT purchased-by (address)>
<!ATTLIST purchased-by
<!ELEMENT address (#PCDATA)>

<!-- order-items can contains at least on item -->
<!ELEMENT order-items (item+)>
<!ATTLIST item

<!-- file: sample.xml -->
<?xml version="1.0"?>

<!DOCTYPE purchase-order SYSTEM "">

   XML document may refer DTD-file that
	is located somewhere on WEB.

<purchase-order date="2005-10-31" number="12345">

	<purchased-by name="My name">
		we comment it to lead an error:
		<address>My address</address>

			here is an example of empty element
			i.e. containing no nested elements
		<item code="687" type="CD" label="Some music" />
		<item code="129851" type="DVD" label="Some video"/>


import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.InputSource;

 * This is a sample of entity-resolvers usage.
 * Resolvers are used to substitute referenced network
 * resourced by local (downloaded) copies.

public class SampleOfResolvingEntities {
     * Application entry point
     * @param args command-line arguments
    public static void main(String[] args) {
        try {
            // creates and returns new instance of SAX-implementation:
            SAXParserFactory factory = SAXParserFactory.newInstance();
            // create SAX-parser...
            SAXParser parser = factory.newSAXParser();
            // parser.getXMLReader().setEntityResolver();
            // .. define our handler:
            SaxHandler handler = new SaxHandler();
            // and parse:
            parser.parse("sample.xml", handler);
        } catch (Exception ex) {
     * Our own implementation of SAX handler reading
     * a purchase-order data.
    private static final class SaxHandler extends DefaultHandler {
        // handle references occurred in parsed XML:
        public InputSource resolveEntity(String publicId, 
                String systemId) {
            // this will resolve network reference to local file:
            if (systemId.equals(
                        "")) {
                return new InputSource(getClass().getResourceAsStream(
                // return null;
            } else {
                // use the default behaviour
                return null;
        // we enter to element 'qName':
        public void startElement(String uri, String localName, 
                String qName, Attributes attrs) throws SAXException {
            if (qName.equals("purchase-order")) {
        // this is called when document is not valid:
        public void error(SAXParseException ex) throws SAXException {
            System.out.println("ERROR: [at " + 
                    ex.getLineNumber() + "] " + ex);
        // this is called when document is not well-formed:
        public void fatalError(SAXParseException ex) throws SAXException {
            System.out.println("FATAL_ERROR: [at " + 
                    ex.getLineNumber() + "] " + ex);
        public void warning(SAXParseException ex) throws SAXException {
            System.out.println("WARNING: [at " + 
                    ex.getLineNumber() + "] " + ex);

Parent Category: Java SE Tips