代码之家  ›  专栏  ›  技术社区  ›  Paul de Vrieze

如何阻止Sun JDK1.6内置的stax解析器解析DTD实体?

  •  2
  • Paul de Vrieze  · 技术社区  · 17 年前

    我正在使用基于stax事件的API修改XML流。流表示一个HTML文档,包含DTD声明。我想将此DTD声明复制到输出文档中(使用 XMLEventWriter )当我要求工厂忽略DTD时,它不会下载DTD,而是删除整个语句,只留下一个“ <!DOCUMENTTYPE “字符串”。当不忽略时,整个DTD将被下载,并在逐字输出DTD事件时包含在内。我不想用时间下载这个DTD,但要包括完整的DTD规范(解析实体已经被禁用,我不需要)。有人知道如何禁用外部DTD的提取吗?

    2 回复  |  直到 17 年前
        1
  •  4
  •   erickson    17 年前

    您应该能够实现一个自定义的XML解析器,它重定向将外部DTD提取到本地资源的尝试(如果您的代码只解析特定的文档类型,那么这通常是JAR中的类资源)。

    class CustomResolver implements javax.xml.stream.XMLResolver {
    
      public Object resolveEntity(String publicID,
                                  String systemID,
                                  String baseURI,
                                  String namespace)
                      throws XMLStreamException 
      {
        if ("The public ID you expect".equals(publicID)) {
          return getClass().getResourceAsStream("doc.dtd");
        } else {
          return null;
        }
      }
    

    请注意,有些文档只包含“systemid”,因此您应该返回到检查状态。系统标识符的问题在于它应该是“系统”特定的URL,而不是一个众所周知的、稳定的URI。实际上,它经常被当作一个URI来使用。

    setXMLResolver 方法。

        2
  •  1
  •   StaxMan    17 年前

    另外:如果到目前为止您一直在使用与JDK1.6捆绑在一起的默认sun-stax解析器,那么您的原始方法(将support-dtd设置为false)可能适用于woodstox。