Make DocumentBuilder.parse ignore DTD references
Try setting features on the DocumentBuilderFactory:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setValidating(false);dbf.setNamespaceAware(true);dbf.setFeature("http://xml.org/sax/features/namespaces", false);dbf.setFeature("http://xml.org/sax/features/validation", false);dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);DocumentBuilder db = dbf.newDocumentBuilder();...
Ultimately, I think the options are specific to the parser implementation. Here is some documentation for Xerces2 if that helps.
A similar approach to the one suggested by @anjanb
builder.setEntityResolver(new EntityResolver() { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { if (systemId.contains("foo.dtd")) { return new InputSource(new StringReader("")); } else { return null; } } });
I found that simply returning an empty InputSource worked just as well?
I found an issue where the DTD file was in the jar file along with the XML. I solved the issue based on the examples here, as follows: -
DocumentBuilder db = dbf.newDocumentBuilder();db.setEntityResolver(new EntityResolver() { public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { if (systemId.contains("doc.dtd")) { InputStream dtdStream = MyClass.class .getResourceAsStream("/my/package/doc.dtd"); return new InputSource(dtdStream); } else { return null; } }});