Referring to a local DTD in Java
Asked Answered
E

4

11

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?

Eduard answered 13/6, 2011 at 14:32 Comment(2)
Possibly useful to look at this question: #244228Cowherb
Another possibility is to use an XML Catalog that resolves the doctype to a local file without changing the XML. This pushes the change to a parameter to the parser invocation.Lucio
L
4

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)
Lucio answered 13/6, 2011 at 14:46 Comment(0)
U
7

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">
Undulation answered 10/6, 2014 at 9:7 Comment(7)
this is simpler than the first answer !! Thanks HithamThymol
I posted the answer as a web app solution and not for simplicityUndulation
lib folder should contain "only" libraries.Burnt
@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.dtdUndulation
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.Burnt
I had to use a relative path "./lib/dtdName.dtd". Using Windows + Eclipse + Jboss.Demolish
For reference, I solved a build issue by updating the malfunctioning xml with <!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "src/main/resources/META-INF/spring/aspectj.dtd">Spielman
L
4

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)
Lucio answered 13/6, 2011 at 14:46 Comment(0)
P
4

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">
Prehensible answered 28/7, 2016 at 7:42 Comment(3)
This works only with special org.hibernate.util.DTDEntityResolver.Phthisic
java.net.MalformedURLException: unknown protocol: classpath I am getting this exceptionLingle
Nope, that gives a MalformedURL unknown protocol: classpath.Dniren
G
0

Also another way can be to keep the dtd at the localhost so that the final path becomes something like:

<!DOCTYPE hibernate-configuration SYSTEM 
          "http://localhost/hibernate-configuration-3.0.dtd">

Definitely not the most elegant solution but surely does work.

Glace answered 22/5, 2015 at 12:33 Comment(1)
Hacky but works, don't forget the port number if you have one (localhost:8080)Serenaserenade

© 2022 - 2024 — McMap. All rights reserved.