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