---
title: "您是否曾经希望为 Apache Ant 提供一个模式（schema）？"
date: "2012-09-05"
tags: 
  - "ant-schema"
  - "ant-xsd"
  - "apache-ant"
  - "xmlspy"
description: 了解如何使用 XMLSpy 为 Apache Ant 创建自定义 XML 模式，从而为您的 Ant 文件提供更强大的验证和编辑支持。
---
Status: #blog

Tags:  #ant-schema #ant-xsd #apache-ant #xmlspy

Categories: [Altova](/blog/zh/category/altova.md) 
# 您是否曾经希望为 Apache Ant 提供一个模式（schema）？

最近，我在一个软件项目中遇到了一些与 Ant 配置文件相关的问题。我正在使用 [XMLSpy](https://www.altova.com/zh/xmlspy.html) 编辑其中一个配置文件，但由于我没有为脚本指定任何模式（schema），因此无法获得代码提示和自动补全功能。

这看起来像一个简单的问题，于是我开始寻找相关的模式（schema）。

我很快在 Stack Overflow 上找到一个类似的问题。答案是，Ant 没有对应的 schema 或 DTD。原因很简单：在构建一个灵活且全面的 Ant 核心模型的基础上，还能够包含所有外部任务，这本身就是一个挑战。

我立刻想起了，几年前我曾经来过这里，但这次我打算利用XMLSpy的模式生成功能，尝试解决一些问题……

<table class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;" cellspacing="0" cellpadding="0"><tbody><tr><td style="text-align: center;"><a style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;" href="http://lh6.ggpht.com/-0YuLu2iBKTk/UEEWxHUUk5I/AAAAAAAAAU0/Xz5UgEpor1U/s1600-h/clip_image002%25255B3%25255D.jpg"><img style="border: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="clip_image002" src="https://lh5.ggpht.com/-7-tEVMHFTzo/UEEWxala_SI/AAAAAAAAAU8/xonqJUBJBZo/clip_image002_thumb.jpg?imgmax=800" alt="XMLSpy XML editor" width="202" height="177" border="0"></a></td></tr><tr><td class="tr-caption" style="text-align: center;"></td></tr></tbody></table>

<!--more-->

如果无法采用官方的模式定义，您可以使用 XMLSpy 快速创建一个模式，以覆盖您使用的特定任务和功能。 随着您使用更多功能，向您的 XSD 模式添加内容所付出的努力非常小，但您将获得强大的编辑支持和验证帮助，这非常值得。

XMLSpy 可以根据一组 XML 文件生成模式（schema）。具体操作如下：首先，在“项目”菜单中选择“新建项目”来创建一个项目。确保“项目”窗口已打开，如果未打开，请使用“窗口”菜单打开它。然后，右键单击项目文件夹，选择“添加文件”，将您的 Ant 文件添加到该文件夹中。

[![XMLSpy 项目](https://lh5.ggpht.com/-mre2_DXTlp4/UEEWyHDjglI/AAAAAAAAAVM/O_eIwwrQBhY/clip_image004_thumb.jpg?imgmax=800 "XMLSpy Project")](http://lh3.ggpht.com/-RuUoEQXnGbY/UEEWx5722GI/AAAAAAAAAVE/hJh7kKSxiSU/s1600-h/clip_image004%25255B3%25255D.jpg)

在添加文件后，再次右键点击该文件夹，然后选择“生成DTD/Schema”。

[![根据 Ant 文件生成模式](https://lh6.ggpht.com/-ozQ64GJ-nWk/UEEWy4Qxf5I/AAAAAAAAAVc/engfRgPVVMs/clip_image006_thumb.jpg?imgmax=800 "Generating a Schema based on Ant files")](http://lh3.ggpht.com/-eu93uiRCaZI/UEEWyVmYsKI/AAAAAAAAAVU/v9-LmOs5zlc/s1600-h/clip_image006%25255B3%25255D.jpg)

我的项目包含数十个 Ant 脚本，因此我们对 Ant 的使用情况具有相当广泛的覆盖范围，这与我们正在进行的开发工作息息相关。这意味着 XMLSpy 将会看到我们使用 Ant 的各种方式，并生成一个模式，该模式能够涵盖我们迄今为止使用 Ant 所做的一切。

[![Ant 文件](https://lh3.ggpht.com/-UUx0gazWKws/UEEWzeDg4TI/AAAAAAAAAVs/Pxaz6KoFviY/clip_image008_thumb.jpg?imgmax=800 "Ant files ")](http://lh4.ggpht.com/-ymrJbZ-C7FU/UEEWzLlutwI/AAAAAAAAAVk/ZnZLs6ZeTDA/s1600-h/clip_image008%25255B3%25255D.jpg)

生成模式文件非常简单。不过，虽然 XMLSpy 在生成模型方面表现出色，但如果您输入 60 个 Ant 文件，生成的模式文件肯定会非常庞大。您可以在此截图中的“生成模式”对话框中看到我的选择。对我来说，最重要的选项是获取全局类型和少量枚举，以便更轻松地扩展模式。

[![生成 XSD 对话框](https://lh6.ggpht.com/-d6dHbL60V1M/UEEW0Pl0bdI/AAAAAAAAAV8/Jo1vECdU4FQ/clip_image010_thumb.jpg?imgmax=800 "Generate XSD dialog")](http://lh4.ggpht.com/-QccmDlCiiac/UEEWzwq_xuI/AAAAAAAAAV0/iXWZfw_JQLI/s1600-h/clip_image010%25255B3%25255D.jpg)

在对新的XSD进行美化之前，我需要先确定我希望通过这次工作实现什么目标。

Ant 的灵活性非常高，它允许属性中包含各种类型的值，并且许多外部任务都没有命名空间。我并不追求一个完美的模式，只是希望有一个对这个项目有帮助的模式。我的目标是创建一个非常灵活的模式，以便在编辑 Ant 文件时，XMLSpy 能够提供辅助功能，从而提高工作效率。

从长远来看，我们或许会希望进一步完善它，以帮助我们编写更一致、更准确的 Ant 文件，但这属于未来的事情。但目前，我只是想做一个非常简单的概念验证。

考虑到这一点，我开始对生成的模式进行精简。XMLSpy 生成的 XSD 包含了所有情况的详尽描述。它提供了一个在技术上正确的模式，但比我想要的或需要的细节更多。然而，在 XSD 视图中，只需几分钟时间，通过拖动元素并合并不必要的分支，我就得到了一个非常简洁的模型。

[![蚂蚁结构图](https://lh4.ggpht.com/-w_6eLKDf0uY/UEEW0x2LEiI/AAAAAAAAAWM/IQ9kJ0I87kQ/clip_image012_thumb.jpg?imgmax=800 "Ant schema")](http://lh5.ggpht.com/-QtfDL83gfzY/UEEW0iCNveI/AAAAAAAAAWE/rMjq6ILsGgc/s1600-h/clip_image012%25255B3%25255D.jpg)
 
第一个验证的标志是，我能够使用我简化的XSD验证所有大约60个Ant文件。在重新添加了我清理过程中意外遗漏的几个元素后，一切顺利。我右键点击我的项目文件夹，选择“验证所有”。所有文件都以大约5秒的时间批量验证通过。

[![验证 Ant 是否符合生成的模式](https://lh6.ggpht.com/-s3ozsT7aSuk/UEEW1oNCvjI/AAAAAAAAAWc/yHwfkOFnMaM/clip_image014_thumb.jpg?imgmax=800 "Validating Ant against generated schema")](http://lh5.ggpht.com/-ocdYbJiia6g/UEEW1GaH5DI/AAAAAAAAAWU/EMxziDPR_Zw/s1600-h/clip_image014%25255B3%25255D.jpg)
 

第二个关键点是，在使用 XMLSpy 创建新的 Ant 文件时，我获得了上下文相关的帮助。我很快意识到，随着我们使用新的任务和功能，未来将会添加很多新的元素。例如，我发现需要在 `junit` 元素中添加 `sysproperty` 元素，因为我们之前没有使用过这个元素。

但在“模式视图”中，添加一些元素或属性非常简单，并且随着时间的推移，我们将会越来越少地需要这样做。

[![在模式视图中添加元素](https://lh6.ggpht.com/-9vVSTwycnI8/UEEW2Dn0Y5I/AAAAAAAAAWs/zcDGrzUJv2g/clip_image016_thumb.jpg?imgmax=800 "Adding elements in schema view")](http://lh4.ggpht.com/-DBr4vr075Iw/UEEW1yNzjOI/AAAAAAAAAWk/fTHD2c8VKC0/s1600-h/clip_image016%25255B3%25255D.jpg)


总的来说，对于我这样简单的需求来说，创建 Ant 脚本确实是一个小小的成功。

[![使用智能感知功能编辑 Ant 代码](https://lh6.ggpht.com/-j64qoAj-y1s/UEEW2zqdjJI/AAAAAAAAAW8/q1Mm5Ip6uoU/clip_image018_thumb.jpg?imgmax=800 "Editing Ant with intellisense")](http://lh4.ggpht.com/-3Ol_tgqt7q0/UEEW2buRmOI/AAAAAAAAAW0/x1oJ5PFJ6Xs/s1600-h/clip_image018%25255B3%25255D.jpg)


如果您希望将我这个非常简单的框架作为起点，来创建您自己的框架，请点击此处[下载](http://metateam.net/extras/ant-schema.xsd)它。 并且，请告诉我它对您是否有用。
