我正在尝试使用xmltask for ant来修改子目录中的文件:
project/path/to/file.xml
Run Code Online (Sandbox Code Playgroud)
该文件指的是这样的DTD:
<!DOCTYPE data SYSTEM "mydtd.dtd">
Run Code Online (Sandbox Code Playgroud)
我没有灵活性来更改这些文件.
这个DTD存储在同一个子目录中,它一直运行良好:
project/path/to/mydtd.dtd
Run Code Online (Sandbox Code Playgroud)
不幸的是,xmltask试图在我的项目的顶级目录中找到dtd,这是我的构建文件所在的位置,以及我在哪里运行:
[xmltask] java.io.FileNotFoundException:/home/me/project/mydtd.dtd(系统找不到指定的文件)
我在xmltask文档中看到我可以使用xmlcatalog元素来纠正它,告诉它在哪里查找文件.但我需要使用一个dtd元素,我只能找到这个元素的例子,而不是文档; 示例仅显示publicId,如果我正确理解XML,则此文档没有.无论如何,我不需要指定这个,因为我的文档已经说明我的DTD存储在本地并显示在哪里?
为什么xmltask没有正确找到DTD?纠正或解决这种情况的最佳方法是什么?
XML目录是这里的方式,它需要更多的毅力.
正如您正确指出的那样,标准Ant <XmlCatalog>类型仅允许您在使用内联语法时指定公共DTD引用,这对您没用.但是,<XmlCatalog>您还可以指定标准的OASIS语法目录,该目录更加丰富,包括解析SYSTEM DTD引用.
OASIS目录(此处为完整规范)如下所示:
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="mydtd.dtd" uri="project/path/to/mydtd.dtd"/>
</catalog>
Run Code Online (Sandbox Code Playgroud)
然后,您可以从以下位置引用此目录<XmlCatalog>:
<xmlcatalog refid="commonDTDs"/>
<catalogpath>
<pathelement location="path/to/oasis.catalog"/>
</catalogpath>
</xmlcatalog>
Run Code Online (Sandbox Code Playgroud)
就是这样.建立一个可重用的OASIS目录文件是一个好主意,并从各种与XML相关的Ant任务中引用它,所有这些都可以使用<XmlCatalog>.