title: Java 13 DocumentBuilder breaks when parsing DTD file to validate HTML
body: <p>I'm working on program that uses DocumentBuilder to parse an old HTML file so that it can be processed accordingly. Within this HTML file, we have the following </p>
  
  <pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
  </code></pre>
  
  <p>Here's the code snippet that does the reading:</p>
  
  <pre><code>DocumentBuilderFactory documentBuilderFactory;
  DocumentBuilder documentBuilder;
  
  documentBuilderFactory = DocumentBuilderFactory.newInstance();
  documentBuilder = documentBuilderFactory.newDocumentBuilder();
  
  Document doc = documentBuilder.parse(htmlSource);
  </code></pre>
  
  <p>The parsing then fails with the following error:</p>
  
  <pre><code>Error 1:    The declaration for the entity "HTML.Version" must end with '&gt;'.
        Column Number:    3
        System Identifer: null
        toString:         org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 3; The declaration for the entity "HTML.Version" must end with '&gt;'.
        Line Number:      31
        Public Identifer: null
        Caused By:
  
        The declaration for the entity "HTML.Version" must end with '&gt;'.
        Trace Follows:
  
  org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 3; The declaration for the entity "HTML.Version" must end with '&gt;'.
          at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
          at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:178)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1471)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanEntityDecl(XMLDTDScannerImpl.java:1597)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDecls(XMLDTDScannerImpl.java:2021)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDTDExternalSubset(XMLDTDScannerImpl.java:299)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1165)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1040)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:943)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
          at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:541)
          at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
          at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
          at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
          at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
          at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
          at com.rockwellcollins.ana.xml.XmlParser.parse(XmlParser.java:490)
          at com.rockwellcollins.ana.xml.XmlParser.parse(XmlParser.java:592)
          at com.rockwellcollins.qimt.doorsmapper.doorsmapper.HtmlParser.parseHtml(HtmlParser.java:301)
          at com.rockwellcollins.qimt.doorsmapper.doorsmapper.DoorsMapper.applicationSpecificDoIt(DoorsMapper.java:232)
          at com.rockwellcollins.application.common.ApplicationBase.doIt(ApplicationBase.java:795)
          at com.rockwellcollins.qimt.doorsmapper.doorsmapper.DoorsMapper.main(DoorsMapper.java:300)
  </code></pre>
  
  <p>It's complaining about this section of the DTD file:</p>
  
  <pre><code>&lt;!ENTITY % HTML.Version "-//W3C//DTD HTML 4.01 Transitional//EN"
    -- Typical usage:
  
      &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
              "http://www.w3.org/TR/html4/loose.dtd"&gt;
      &lt;html&gt;
      &lt;head&gt;
      ...
      &lt;/head&gt;
      &lt;body&gt;
      ...
      &lt;/body&gt;
      &lt;/html&gt;
  
      The URI used as a system identifier with the public identifier allows
      the user agent to download the DTD and entity sets as needed.
  
      The FPI for the Strict HTML 4.01 DTD is:
  
          "-//W3C//DTD HTML 4.01//EN"
  
      This version of the strict DTD is:
  
          http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd
  
      Authors should use the Strict DTD unless they need the
      presentation control for user agents that don't (adequately)
      support style sheets.
  
      If you are writing a document that includes frames, use 
      the following FPI:
  
          "-//W3C//DTD HTML 4.01 Frameset//EN"
  
      This version of the frameset DTD is:
  
          http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd
  
      Use the following (relative) URIs to refer to 
      the DTDs and entity definitions of this specification:
  
      "strict.dtd"
      "loose.dtd"
      "frameset.dtd"
      "HTMLlat1.ent"
      "HTMLsymbol.ent"
      "HTMLspecial.ent"
  
  --&gt;
  </code></pre>
  
  <p>From my initial investigation, it's complaining about the <code>--</code> comments within the tags. If I remove those, then the first error disappears and moves onto the next one. My question is, how come the DocumentBuilder is not able to read the DTD file correctly?</p>
  
  <p>To add a few things, we are unable to remove the DTD from the HTML file because the HTML provided is HTML 4 specific and without it, the parsing fails because of the HTML 4 formatting.</p>