Ant:我可以从xml文件中获取特定属性吗?

时间:2011-05-09 11:12:57

标签: xml ant

我使用ant安装服务器进行测试。 在属性文件中,我有一个数据库参数列表。 问题是我需要在更改数据库时更改5-6个参数。 其中大多数取决于数据库名称。所以我认为我创建了一个包含我们使用的所有不同数据库的xml文件,只需在属性文件中输入名称即可。 然后,当构建文件运行时,它将获取所用数据库的正确属性。 我创建了一个像这样的xml文件:

<databases>
<database>
    <server>mssql_1</server>
    <port>1433</port>
    <sid_instance>foobar</sid_instance>
    <path></path>
    <hostuser>sa</hostuser>
    <hostpwd>password</hostpwd>
    </database>
<database>
    <server>oracle_1</server>
    <port>1521</port>
    <sid_instance>foobar</sid_instance>
    <path>C:\\oracle\\oradata\\foobar</path>
    <hostuser>system</hostuser>
    <hostpwd>password</hostpwd>
</database>
</databases>

我用我的构建文件调用该文件:

<xmlproperty file="databases.xml"  />

因此,当我的属性文件声明要使用“mssql_1”时,我希望加载匹配的属性。

但是无论我如何尝试选择正确的数据,当我尝试

时,我会得到所有端口:“1433,1521”
<echo message="${databases.database.port}">

我已经找到了不同的方法来做到这一点,但我找不到办法做到这一点。 但似乎应该是一件容易的事情....

1 个答案:

答案 0 :(得分:3)

您的属性文件有两个具有相同值的实体。 <xmlproperty>任务读取整个XML文件,然后使用实体设置属性名称。如果您碰巧有两个具有相同属性的实体,那么该特定属性的值将同时存在。

大多数人所做的是为每个数据库都有一个单独的属性文件,然后使用<property>任务和file参数来读取该特定属性文件。所以你应该有两个属性文件:

database.mssql.properties

server=mssql_1
port=1433
sid_instance=foobar
path=
hostuser=sa
hostpwd=password

database.oracle.properties

server=oracle_1
port=1521
sid_instance=foobar
path=C:/oracle/oradata/foobar
hostuser=ssytem
hostpwd=password

然后,在您的build.xml文件中,您根据数据库读取了一个且只有一个属性文件:

<property name="database"  value="mssql"/>   <!-- Default database -->
<property name="database.file   value="database.${database}.properties"/>

<fail message="No such database file &quot;${database.file}&quot;">
    <condition>
        <not>
            <available file="${database.file} type="file"/>
        </not>
    </condition>
 </fail>

<property file="${database.file}"/>

当有人运行Ant时,他们可以使用-D参数来设置数据库:

$ ant -Ddatabase=oracle

这将覆盖database文件中的build.xml属性并使用Oracle数据库。如果未指定数据库,则将使用默认数据库(MS SQL)。

并且,如果另一个属性文件指定属性文件名:

,这也将起作用
<property file="build.properties"> <!-- Contains database name -->
<property name="database.file"   value="database.${database}.properties"/>