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