问题
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?
回答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)
回答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">
回答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">
回答4:
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.
来源:https://stackoverflow.com/questions/6331831/referring-to-a-local-dtd-in-java