【问题标题】:XML Catalog file failing to resolveXML 目录文件无法解析
【发布时间】:2010-04-29 15:06:57
【问题描述】:

我正在使用兼容 OASIS v 1.1 的解析器(Norm Walsh 的 XMLResolver 以及下面的目录。但是,我很确定我在这里犯了某种明显的错误(这是我第一次'需要使用 v 1.1 功能),因为尝试解决 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>

更新:使用 group 元素上设置的 xml:base 可以很好地解析所有 public 元素。只有那些应该使用 systemSuffix 失败的元素解决的元素。因此,如果我有一个使用 PUBLIC 标识符声明其 DocType 的文档,它将毫无问题地解决(我的 CatalogManager.properties 中有一个 prefer=public 设置)。但是,如果我只有一个 SYSTEM 标识符(例如“OxChapML.dtd”),这应该与适当的 systemSuffix 匹配,但事实并非如此。在解析器上打开调试表明它甚至没有尝试通过systemSuffix 进行匹配。

【问题讨论】:

    标签: java xml catalog xmlcatalog


    【解决方案1】:

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

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

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

    【讨论】:

    • 抱歉。我在那里错过了各种有用的信息。查看更新后的问题!
    • 对不起,应该早点回复你。我刚刚查看了 OASIS Entity Resolution TC(编写 XML 目录规范)的笔记。有一个与 SAX 如何解释相对 URI 相关的已知问题。这意味着如果您有像 这样的“systemSuffix”定义,则应该为“uri”使用完整的文件 URL,而不是相对 URL。此外,行 看起来无效。
    • 谢谢-即使我确实花了几个月的时间才做出回应-最终结果证明这是一个不同且更令人尴尬的问题-在类路径中找到了旧版本的 apache commons resolver: (
    【解决方案2】:

    我刚刚遇到了一种需要很长时间才能解决的情况,在我的开发环境中一切正常,但在生产环境中它无声地死了。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2017-05-31
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 2017-08-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多