Make DocumentBuilder.parse ignore DTD references Make DocumentBuilder.parse ignore DTD references java java

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;         }      }});