我正在尝试使用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?纠正或解决这种情况的最佳方法是什么?
答案 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)
答案 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><!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"></replacetoken>
<replacevalue><!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --></replacevalue>
</replace>
<xmltask .../>
<replace file="${local.opencms.webapp.webinf}/config/opencms-modules.xml">
<replacetoken><!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --></replacetoken>
<replacevalue><!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"></replacevalue>
</replace>