在Java中引用本地DTD

在Java中引用本地DTD,java,xml,sax,dtd,Java,Xml,Sax,Dtd,我有一些XML,我正在用Java中的SAX解析器进行解析。它从序言开始: <!DOCTYPE math PUBLIC "-//W3C//DTD MathML 3.0//EN" "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd"> 如何将其更改为使用本地DTD 我想我可以这样做: <!DOCTYPE math PUBLIC "-//W3C//DTD MathML 3.0//EN"

我有一些XML,我正在用Java中的SAX解析器进行解析。它从序言开始:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN"
           "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd">

如何将其更改为使用本地DTD

我想我可以这样做:

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN"
           "file:///c:/MathML/mathml3.dtd">

不完全是那样,但差不多是那样。但是,我需要独立于用户系统的路径

如何使用具有相对于类路径的路径的本地DTD?

了解如何使用XML目录在本地解析DTD,而无需修改XML源。基本步骤是:

  • 创建将系统ID映射到本地DTD的XML文件
  • 修改代码以实例化和配置CatalogResolver
  • 向XML读取器提供CatalogResolver(从解析器获得)

  • 处理Web应用程序时,您可以将dtd放在lib文件夹中,并像以下那样引用它:

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

    另一种方法是将dtd保留在本地主机上,以便最终路径类似于:

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

    肯定不是最优雅的解决方案,但确实有效。

    解决方案是使用类路径在系统中提供DTD文件位置。因此脱机工作的DocType是:

    <!DOCTYPE hibernate-configuration SYSTEM 
        "classpath://org/hibernate/hibernate-configuration-3.0.dtd">
    
    
    
    了解这个问题可能很有用:另一种可能是使用XML目录,在不更改XML的情况下将doctype解析为本地文件。这会将对参数的更改推送到解析器调用。这比第一个答案更简单!!感谢HithamI将答案发布为web应用解决方案,而不是simplicitylib文件夹应包含“仅”库。@Mehdi,DTD通常位于JAR中,JAR位于lib文件夹中。您只需将它们以不同的方式引用为
    jar:file:/log4j.jar/org/apache/log4j/xml/log4j.dtd
    不知道您可以在jar中引用dtd,但它是一个文件appart,为什么不将它放在conf/dtd这样的路径中,并尽可能保留jar的lib文件夹呢。Hacky但是有效,如果您有端口号,请不要忘记端口号(localhost:8080)这仅适用于特殊的.java.net.MalformedURLException:unknown protocol:classpath我收到了此异常