Referring to a local DTD in Java
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:
- create an XML file that maps system IDs to local DTDs
- modify your code to instantiate and configure a CatalogResolver
- 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">
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, 2022Comments
-
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 about 9 yearsthis is simpler than the first answer !! Thanks Hitham
-
Mo Beigi over 7 yearsHacky but works, don't forget the port number if you have one (localhost:8080)
-
Vadzim about 7 yearsThis works only with special org.hibernate.util.DTDEntityResolver.
-
Sully over 6 yearsI posted the answer as a web app solution and not for simplicity
-
Jerry almost 6 yearsjava.net.MalformedURLException: unknown protocol: classpath I am getting this exception
-
Mehdi over 5 yearslib folder should contain "only" libraries.
-
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 over 5 yearsDidn'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.