2

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

4

2 回答 2

4

您应该能够实现一个自定义 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方法。

于 2008-11-21T18:04:03.237 回答
1

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

于 2009-01-27T20:42:18.613 回答