我正在使用OASIS v 1.1兼容解析器(Norm Walsh的XMLResolver以及下面的目录。但是,我很确定我在这里犯了一些明显的错误(这是第一个)因为尝试解决OxChapML.dtd失败了,所以我需要使用v 1.1功能。任何人都可以看到明显错误的东西吗?或者甚至是巧妙的错误?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD XML Catalogs V1.1//EN"
"http://www.oasis-open.org/committees/entity/release/1.1/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<group xml:base="file:///Volumes/Ac-EDP/DTG/SP%20DTD%20management/OUP_DTD/">
<public publicId="-//OXFORD//DTD OXCHAPML//EN" uri="OxChapML.dtd"/>
<public publicId="-//OXFORD//DTD OXENCYCLML//EN" uri="xEncyclML.dtd"/>
<public publicId="-//OXFORD//DTD OXLAWML//EN" uri="OxLawML.dtd"/>
<public publicId="-//OXFORD//DTD OXSTRUCTML//EN" uri="OxStructML.dtd"/>
<public publicId="-//OXFORD//DTD OXLAWREPML//EN" uri="OxLawRepML.dtd"/>
<public publicId="-//OXFORD//DTD OXBILINGML//EN" uri="OxBilingML.dtd"/>
<public publicId="-//OXFORD//DTD OXMONOLINGML//EN" uri="OxMonolingML.dtd"/>
<public publicId="-//OXFORD//DTD TIMELINES//EN" uri="timelines.dtd"/>
<systemSuffix OxChapML.dtd" systemIdSuffix="OxChapML.dtd"/>
<systemSuffix uri="xEncyclML.dtd" systemIdSuffix="xEncyclML.dtd"/>
<systemSuffix systemIdSuffix="OxLawML.dtd" uri="OxLawML.dtd"/>
<systemSuffix systemIdSuffix="OxStructML.dtd" uri="OxStructML.dtd"/>
<systemSuffix systemIdSuffix="OxLawRepML.dtd" uri="OxLawRepML.dtd"/>
<systemSuffix systemIdSuffix="OxBilingML.dtd" uri="OxBilingML.dtd"/>
<systemSuffix systemIdSuffix="OxMonolingML.dtd" uri="OxMonolingML.dtd"/>
<systemSuffix systemIdSuffix="timelines.dtd" uri="timelines.dtd"/>
</group>
</catalog>
更新:使用public
元素上的xml:base
设置,所有group
个元素都可以解决。只有那些应该使用失败的systemSuffix
元素解决的元素。因此,如果我有一个使用PUBLIC标识符声明其DocType的文档,它将解决没有问题(我的CatalogManager.properties中有prefer=public
设置)。但是,如果我只有一个SYSTEM标识符(例如“OxChapML.dtd”),那么它应该由相应的systemSuffix
匹配,但事实并非如此。打开解析器上的调试显示它甚至没有尝试通过systemSuffix
进行匹配。
答案 0 :(得分:1)
DTD在哪里?在与目录文件相同的目录中?你的URI都是相对的。相对URI相对于目录文件的位置进行解析(除非已设置xml:base)。它们与要验证的XML文件的位置无关。
如果不知道各个文件相对于彼此的位置,就很难猜到这个问题。
您是否能够将目录解析与所有DTD一起使用?
答案 1 :(得分:1)
我遇到了一个需要很长时间才能解决的问题,在我的开发环境中,一切都运行良好,但在生产环境中它静静地 。
起初我认为这可能是目录文件上的XML命名空间问题,但那是一条死胡同。
事实证明,目录层次结构中catalog.xml文件的 one 上存在DOCTYPE声明是罪魁祸首。我忽略的开发和生产环境之间的区别在于后者(封闭内部网中的VDI)无法访问开放的互联网。因此目录解析器无法打开catalog.dtd文件的系统标识符(即http:
URL)。一旦我删除了DOCTYPE声明,一切都按预期工作。
非常令人沮丧。目录解析器对此保持沉默可能被认为是一个错误 - 应该至少将这种错误渗透到日志中,或者最好抛出异常。
通常,您可以将catalog.xml作为格式良好的XML进行处理,因此通常可以放弃DOCTYPE声明。