With the DTD location specified in the XML Document using a DOCTYPE declaration.
try { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware( true); factory.setValidating( true); XMLReader reader = parser.getXMLReader(); reader.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 { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware( true); factory.setValidating( true); XMLReader reader = parser.getXMLReader(); reader.setEntityResolver( DTDEntityResolver( "file:test.dtd")); reader.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 newSystemId = null; boolean firstPass = true; public DTDEntityResolver( String systemId) { this.newSystemId = systemId; } public InputSource resolveEntity( String publicId, String systemId) throws SAXException, IOException { InputSource result = null; if ( firstPass) { result = new InputSource( newSystemId); } else { result = new InputSource( systemId); } firstPass = false; return result; } }