5

我正在尝试使用 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?纠正或解决这种情况的最佳方法是什么?

4

5 回答 5

5

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>

然后,您可以从以下位置引用此目录<XmlCatalog>

<xmlcatalog refid="commonDTDs"/>
  <catalogpath>
    <pathelement location="path/to/oasis.catalog"/>
  </catalogpath>
</xmlcatalog>

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

于 2010-01-08T21:08:37.900 回答
1

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

于 2010-02-02T17:45:16.017 回答
0

你有没有尝试过:

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

? 还是绝对路径?

此外,您可以在此处<dtd>找到描述。

于 2009-09-29T13:53:18.420 回答
0

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

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

令我震惊的是,您真正遇到问题的不是 XML/DTD,而是让 xmltask 以您想要的方式与它们两者进行交互。

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

于 2010-01-08T20:48:32.057 回答
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) (参见http:// /ant.apache.org/manual/Types/xmlcatalog.html)。

因为我有多台机器应该运行这个构建,这似乎有点过头了,特别是因为如果我只是删除了 doctype 定义,xmltask 工作得很好。我不允许永久删除它,因为其他地方需要该文档类型。

replace最终我使用了这个解决方法:我使用 Ant 的任务注释掉了 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>
于 2013-05-15T00:53:42.683 回答