Referring to a local DTD in Java

六眼飞鱼酱① 提交于 2019-12-05 20:02:24

问题


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:

  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)



回答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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!