Referring to a local DTD in Java

22,276

Solution 1

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)

Solution 2

When dealing with Web Apps, you can put the dtd in the lib folder and refer to it like:

<!DOCTYPE name PUBLIC 
    "-//CMP//DTD dtdName 1.0//EN"
        "/WEB-INF/lib/dtdName.dtd">

Solution 3

The solution is to provide the DTD file location in the system using classpath. So the DocType that worked offline would be:

<!DOCTYPE hibernate-configuration SYSTEM 
    "classpath://org/hibernate/hibernate-configuration-3.0.dtd">
Share:
22,276
JanusFox81
Author by

JanusFox81

I am interested in functional programming. I am also interested in music programming, such as in ChucK or impromptu. My favorite language is Lisp.

Updated on August 01, 2022

Comments

  • JanusFox81
    JanusFox81 over 1 year

    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?

  • mounaim
    mounaim about 9 years
    this is simpler than the first answer !! Thanks Hitham
  • Mo Beigi
    Mo Beigi over 7 years
    Hacky but works, don't forget the port number if you have one (localhost:8080)
  • Vadzim
    Vadzim about 7 years
    This works only with special org.hibernate.util.DTDEntityResolver.
  • Sully
    Sully over 6 years
    I posted the answer as a web app solution and not for simplicity
  • Jerry
    Jerry almost 6 years
    java.net.MalformedURLException: unknown protocol: classpath I am getting this exception
  • Mehdi
    Mehdi over 5 years
    lib folder should contain "only" libraries.
  • Sully
    Sully over 5 years
    @Mehdi, DTDs are usually inside JARs, which are in the lib folder. You just have to reference them differently as jar:file: <absolute-path>/log4j.jar!/org/apache/log4j/xml/log4j.dtd
  • Mehdi
    Mehdi over 5 years
    Didn't know you can reference a dtd inside a jar, but it's a file appart, why not to place it in a path like conf/dtd and keep the lib folder for jars as possible.