Search code examples
javaxmlsaxdtd

Referring to a local DTD in Java


I have some XML that I'm parsing with a SAX parser in Java. It starts with this preamble:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN"
           "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd">

How do I change this to use a local DTD?

I suppose I could do something like this:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN"
           "file:///c:/MathML/mathml3.dtd">

Not exactly like that, but something like that. However, I need the path to be independent of the user's system.

How do I use a local DTD with a path relative to the class path?


Solution

  • Take a look at this article on using XML catalogs to resolve DTDs locally without having to modify your XML source. The basic steps are:

    1. create an XML file that maps system IDs to local DTDs
    2. modify your code to instantiate and configure a CatalogResolver
    3. provide the CatalogResolver to the XML Reader (obtained from the parser)