1

我正在使用兼容 OASIS v 1.1 的解析器(Norm Walsh 的XMLResolver以及下面的目录。但是,我很确定我在这里犯了某种明显的错误(这是我第一次需要使用v 1.1 features),因为尝试解决 OxChapML.dtd 失败。任何人都可以看到明显的错误吗?甚至是微妙的错误?

<?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元素都可以很好地解析。只有那些应该使用失败的元素来解决的元素。因此,如果我有一个使用 PUBLIC 标识符声明其 DocType 的文档,它将毫无问题地解决(我的 CatalogManager.properties 中有一个设置)。但是,如果我只有一个 SYSTEM 标识符(例如“OxChapML.dtd”),这应该与适当的匹配,但事实并非如此。在解析器上打开调试表明它甚至没有尝试通过.xml:basegroupsystemSuffixprefer=publicsystemSuffixsystemSuffix

4

2 回答 2

1

我刚刚遇到了一种需要很长时间才能解决的情况,在我的开发环境中一切都运行良好,但在生产环境中却无声无息地死掉了。

起初我认为这可能是目录文件上的 XML 命名空间问题,但那是一条死胡同。

事实证明,目录层次结构中的一个catalog.xml 文件中存在 DOCTYPE 声明是罪魁祸首。我忽略的开发和生产环境之间的区别在于后者(封闭 Intranet 中的 VDI)无法访问开放 Internet。因此,目录解析器无法打开 catalog.dtd 文件的系统标识符(即http:URL)。一旦我删除了 DOCTYPE 声明,一切都按预期工作。

非常令人沮丧。目录解析器对此保持沉默可能被认为是一个错误——它应该至少将此类错误渗透到日志中,或者最好抛出异常。

作为一项规则,您可能可以将您的 catalog.xml 处理为格式正确的 XML,因此通常可以安全地省略 DOCTYPE 声明。

于 2012-02-03T00:20:05.667 回答
1

DTD 位于何处?在与目录文件相同的目录中?您的 URI 都是相对的。相对 URI 相对于目录文件的位置进行解析(除非已设置 xml:base)。它们与正在验证的 XML 文件的位置无关。

如果不知道各个文件相对于彼此的位置,就很难猜出问题所在。

您是否能够使用任何 DTD 获得目录解析?

于 2010-05-01T09:04:27.187 回答