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

时间:2008-11-21 17:31:04

标签: java xml parsing stax

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

2 个答案:

答案 0 :(得分:4)

您应该能够实现一个自定义XMLResolver,重定向将外部DTD提取到本地资源的尝试(如果您的代码仅解析特定的doc类型,这通常是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方法。

答案 1 :(得分:1)

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