xmltask对dtd感到困惑

时间:2009-09-29 13:45:46

标签: ant dtd

我正在尝试使用xmltask for ant来修改子目录中的文件:

project/path/to/file.xml

该文件指的是这样的DTD:

<!DOCTYPE data SYSTEM "mydtd.dtd">

我没有灵活性来更改这些文件。

这个DTD存储在同一个子目录中,该子目录一直运行良好:

project/path/to/mydtd.dtd

不幸的是,xmltask试图在我项目的顶级目录中找到dtd,这是我的构建文件所在的位置,以及我在哪里运行:

[xmltask] java.io.FileNotFoundException:/home/me/project/mydtd.dtd(系统找不到指定的文件)

我在xmltask文档中看到我可以使用 xmlcatalog 元素来纠正它,告诉它在哪里查找文件。但我需要使用 dtd 元素,我只能找到这个元素的例子,而不是文档;示例仅显示publicId,如果我正确理解XML,则此文档没有。无论如何,我不需要指定这个,因为我的文档已经说明我的DTD存储在本地并显示在哪里?

为什么xmltask没有正确找到DTD?纠正或解决这种情况的最佳方法是什么?

5 个答案:

答案 0 :(得分:5)

XML目录是这里的方法,它只需要更多的毅力。

正如您正确指出的那样,标准Ant <XmlCatalog>类型仅允许您在使用内联语法时指定公共DTD引用,这对您没用。但是,<XmlCatalog>还允许您指定标准的OASIS语法目录,该目录更加丰富,包括解析SYSTEM DTD引用。

OASIS目录(完整规范here)如下所示:

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">      
  <system systemId="mydtd.dtd" uri="project/path/to/mydtd.dtd"/>
</catalog>

然后,您可以从<XmlCatalog>

中引用此目录
<xmlcatalog refid="commonDTDs"/>
  <catalogpath>
    <pathelement location="path/to/oasis.catalog"/>
  </catalogpath>
</xmlcatalog>

就是这样。建立可重用的OASIS目录文件是一个好主意,并从各种与XML相关的Ant任务中引用它,所有这些任务都可以使用<XmlCatalog>

答案 1 :(得分:1)

作为替代方案,看起来我可以通过创建一个与DVD文件同名的空白文件来跳过整个验证,然后在完成后删除该文件。赔率是我要去那条路而不是使用目录。

答案 2 :(得分:0)

你试过了吗?

<!DOCTYPE data SYSTEM "./path/to/mydtd.dtd">

?还是绝对的路径?

另外,您可以找到<dtd>说明here

答案 3 :(得分:0)

xmltask没有找到它,因为它正在查找当前的工作目录。 Ant允许您使用basedir元素的<target>属性指定基目录。所以我建议你试试这个:

<target basedir="path/to" ...>
  <xmltask...
</target>

令我感到震惊的是,你确实遇到问题不是XML / DTD,而是让xmltask根据需要与其中两个进行交互。

如果失败,您可以使用Ant Copy任务将XML和DTD复制到根文件夹,然后再使用xmltask进行处理,然后再次复制。

答案 4 :(得分:0)

我遇到了类似的问题,其中XML文件的doctype带有SYSTEM引用,无法更改。

<!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd">

我首先开始使用如上所述的OASIS目录创建目录文件,但是为了能够使用外部目录,我必须在 Ant中包含Apache Commons Resolver 1.1(resolver.jar) classpath (参见http://ant.apache.org/manual/Types/xmlcatalog.html)。

因为我有多台机器应该运行这个构建,这似乎有点过分,特别是因为xmltask工作正常,如果我刚刚删除了doctype定义。我不被允许永久删除它,因为其他地方需要doctype。

最终我使用了这个解决方法:我使用Ant的replace任务注释掉了doctype定义,运行了xmltask,然后将doctype放回到文件中。

<replace file="myxmlfile.xml">
    <replacetoken>&lt;!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"&gt;</replacetoken>
    <replacevalue>&lt;!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --&gt;</replacevalue>
</replace>

<xmltask .../>

<replace file="${local.opencms.webapp.webinf}/config/opencms-modules.xml">
    <replacetoken>&lt;!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --&gt;</replacetoken>
    <replacevalue>&lt;!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"&gt;</replacevalue>
</replace>