【问题标题】:How do I include a DTD in an XML file that will be loaded using getResourceAsStream()?如何在将使用 getResourceAsStream() 加载的 XML 文件中包含 DTD?
【发布时间】:2010-09-24 04:18:41
【问题描述】:

我有一个使用以下 DOCTYPE 定义 DTD 的 xml 文件 ('videofaq.xml')

<!DOCTYPE video-faq SYSTEM "videofaq.dtd">

我在 Servlet 初始化时从类路径(实际上是从 JAR)加载文件:

getClass().getResourceAsStream("videofaq.xml")

正确找到了 XML,但对于同一包中的 DTD,Xerces 给了我一个 FileNotFoundException,并显示 Tomcat 启动脚本的路径,并在末尾附加了“videofaq.dtd”。我可以将哪些提示(如果有)传递给 Xerces 以使其正确加载 DTD?

【问题讨论】:

    标签: java xml xerces


    【解决方案1】:

    自定义 EntityResolver 可以工作,但您可以通过设置 SystemID 以允许处理器“查找”相对路径来避免创建自定义类。

    http://www.onjava.com/pub/a/onjava/excerpt/java_xslt_ch5/index.html?page=5

    通过提供系统标识符作为 StreamSource 的参数,你是 告诉 XSLT 处理器去哪里 寻找 commonFooter.xslt。没有 这个参数,你可能会遇到 处理器不能时出错 解析这个 URI。简单的解决方法是 调用 setSystemId() 方法为 如下:

    // construct a Source that reads from an InputStream
    Source mySrc = new StreamSource(anInputStream);
    // specify a system ID (a String) so the 
    // Source can resolve relative URLs
    // that are encountered in XSLT stylesheets
    mySrc.setSystemId(aSystemId);
    

    【讨论】:

      【解决方案2】:

      当你这样做时

      getClass().getResourceAsStream("videofaq.xml")
      

      您调用的不是 xerces,因此,当您将流提供给 xerces 时,它无法知道文件是从哪里加载的。它从应用程序根路径(您已描述)加载它。

      一个简单的解决方案是在 xml 文件中指定 dtd 的整个路径。

      此外,xerces 似乎尝试了多个地方。所以你应该看看语法缓存机制或实体解析器(我认为它们是按顺序使用的)。

      Xerces 语法文档:http://xerces.apache.org/xerces2-j/faq-grammars.html

      Xerces 功能使用实体解析器2:http://xerces.apache.org/xerces2-j/features.html

      【讨论】:

        【解决方案3】:

        使用 SAX 时,您可以提供自己的 EntityResolver,然后以您想要的任何方式加载资源。

        【讨论】:

          【解决方案4】:

          通常,在为 XML 解析器指定输入时,请尝试使用采用 URL 的方法重载(通常作为带有参数名称的字符串,例如“systemId”)。这允许解析器为您解析相对引用,并提供更好的错误消息。

          因此,在您的情况下,将 DTD 与 videofaq.xml 放在同一个包中,并将 getClass().getResource("videofaq.xml")String 结果传递给 XML 解析器。

          【讨论】:

            猜你喜欢
            • 2011-06-12
            • 1970-01-01
            • 2020-06-18
            • 2014-12-26
            • 1970-01-01
            • 1970-01-01
            • 2011-04-24
            • 2014-10-02
            • 2020-09-08
            相关资源
            最近更新 更多