gpt4 book ai didi

java - 在 SAX 解析器中处理具有依赖性的私有(private)外部 DTD

转载 作者:行者123 更新时间:2023-11-28 23:31:22 25 4
gpt4 key购买 nike

我正在尝试使用 DOCTYPE 中指定的专用外部 DTD 解析 XML 文件,如下所示:

<!DOCTYPE MY1 SYSTEM "my1.dtd">

为了在本地处理此 DTD 以进行验证,我指定了 EntityResolver对于 XMLReader parser :

        //use local DTD
parser.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
if (systemId.contains(my1Dtd)) {
return new InputSource(MyClass.class.getResourceAsStream(MY1_DTD_RESOURCE_PATH));
} else {
return null;
}
}
});

InputSource正确返回,但存在与 DTD 相关的问题:在 DTD 内部存在对另一个 DTD 的引用。所以我将所有 DTD 放在同一个包中。但是当我的应用程序部署在 Tomcat 上时 FileNotFoundException D:\apache-tomcat-6.0.29\bin\my2.dtd (The system cannot find the file specified)被抛出。

我的问题是:我们如何才能正确指定这种依赖关系?是否应该在resolveEntity中 build 方法或者我在路径中犯了错误(my2.dtd<!ENTITY % MY2 SYSTEM "my2.dtd"> 中声明为 my1.dtd 并存储在同一个包中)。

最佳答案

当解析器需要加载 my2.dtd 文件时,也应该调用 resolveEntity

因此您需要以类似的方式修改它:

 public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
if (systemId.contains(my1Dtd)) {
return new InputSource(MyClass.class.getResourceAsStream(MY1_DTD_RESOURCE_PATH));
} else if (systemId.contains(my2Dtd)) {
return new InputSource(MyClass.class.getResourceAsStream(MY2_DTD_RESOURCE_PATH));
} else {
return null;
}
}

但是,为避免此类工作,您应该考虑使用解析器,例如 the Apache resolver .此解析器依赖于 OASIS entity resolution / XML catalogs ,它允许您创建一个 XML 格式的目录,由解析器读取,这样您就不需要在每次拥有新的 DTD 或将其移动到另一个地方或其他任何地方时都修改您的代码。(这个解析器包与 Apache Xerces 发行版捆绑在一起,如果它已经是您正在使用的解析器的话)。

关于java - 在 SAX 解析器中处理具有依赖性的私有(private)外部 DTD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927485/

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