代码之家  ›  专栏  ›  技术社区  ›  Nic Gibson

无法解析XML目录文件

  •  1
  • Nic Gibson  · 技术社区  · 15 年前

    我用的是OASISV1.1兼容的解析器(NormWalsh's 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>
    

    更新:所有 public 元素使用 xml:base 设置在 group 元素。只有那些元素才应该使用 systemSuffix 失败的元素。因此,如果我有一个使用公共标识符声明其DocType的文档,它将不会出现任何问题(我的目录管理器.properties有一个 prefer=public 设置)。但是,如果我只有一个系统标识符(例如“OxChapML.dtd公司)这应该与适当的 系统后缀 但事实并非如此。打开解析器上的调试表明它甚至没有尝试通过 系统后缀 .

    2 回复  |  直到 15 年前
        1
  •  1
  •   abcoates    15 年前

    DTD在哪里?与目录文件在同一目录下?你的uri都是相对的。相对uri是相对于目录文件的位置解析的(除非xml:base有已设置)。它们与正在验证的XML文件的位置无关。

    很难在不知道不同文件相对位置的情况下猜测问题。

    你能用任何DTD都能得到目录分辨率吗?

        2
  •  1
  •   Ichiro Furusato    13 年前

    我刚刚遇到了一个需要很长时间才能解决的问题,在我的开发环境中,一切都很好,但是在生产环境中,一切都结束了 默默地 .

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

    原来DOCTYPE声明的存在 的目录.xml目录层次结构中的文件是罪魁祸首。我忽略了开发环境和生产环境之间的区别,后者(封闭内部网中的VDI)不能访问开放的internet。所以目录解析程序无法打开目录.dtd文件(即 http: 网址)。我一删除DOCTYPE声明,一切都按预期工作。

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

    通常你可以处理目录.xml以及格式良好的XML,因此通常可以安全地省略DOCTYPE声明。

    推荐文章