【问题标题】:How do I stop the Sun JDK1.6 builtin StAX parser from resolving DTD entities如何阻止 Sun JDK1.6 内置 StAX 解析器解析 DTD 实体
【发布时间】:2010-09-23 11:59:49
【问题描述】:

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

【问题讨论】:

    标签: java xml parsing stax


    【解决方案1】:

    另外:如果到目前为止您一直在使用与 JDK 1.6 捆绑的默认 Sun stax 解析器,那么您的原始方法(将 SUPPORT_DTD 设置为 false)可能适用于 Woodstox。

    【讨论】:

      【解决方案2】:

      您应该能够实现自定义 XMLResolver,它将获取外部 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 方法。

      【讨论】:

      • 只有在我使用woodstox 时才能设置。我试图使用太阳提供者。
      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2016-10-30
      • 1970-01-01
      • 2012-05-27
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多