DocumentBuilderFactory DTD Validation

With the DTD location specified in the XML Document using a DOCTYPE declaration.

try {
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  factory.setNamespaceAware( true);
  factory.setValidating( true);

  DocumentBuilder builder = factory.newDocumentBuilder();

  Document document = builder.parse( new Inputsource( "test.xml"));

} catch ( ParserConfigurationException e) {
  e.printStackTrace();
} catch ( SAXException e) {
  e.printStackTrace();
} catch ( IOException e) {
  e.printStackTrace();
}
			

With the DTD location specified using a bespoke entity resolver (only works if a DOCTYPE with a systemId has been specified in the document).

try {
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  factory.setNamespaceAware( true);
  factory.setValidating( true);

  DocumentBuilder builder = factory.newDocumentBuilder();
  builder.setEntityResolver( DTDEntityResolver( "file:test.dtd"));

  Document document = builder.parse( new Inputsource( "test.xml"));

} catch ( ParserConfigurationException e) {
  e.printStackTrace();
} catch ( SAXException e) {
  e.printStackTrace();
} catch ( IOException e) {
  e.printStackTrace();
}

public static class DTDEntityResolver implements EntityResolver {
  private String systemId = null;
  private String substitute = null;

  public DTDEntityResolver( String systemId, String substitute) {
    this.systemId = systemId;
    this.substitute = substitute;
  }

  public InputSource resolveEntity( String publicId, String systemId) throws SAXException, IOException {
    if ( this.systemId.equals( systemId)) {
      return new InputSource( substitute);
    }

    return null;
  }
}