gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:56 26 4
gpt4 key购买 nike

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

最佳答案

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

关于java - 如何阻止 Sun JDK1.6 内置 StAX 解析器解析 DTD 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com