如果提供给ant的xml属性文件具有重复的xml元素,如何在ANT中查找特定属性

时间:2018-02-15 21:20:25

标签: ant

我正在尝试在ANT中读取属性文件(xml)。

以下是样本数据。

<WebLogicDomain>
    <Domain>MyDomain</Domain>
    <Environment>DEV</Environment>
    <Servers>
        <Server id = '1'>
            <Host>Host1</Host>
            <Port>14100</Port>
            <AliasName>adminserver</AliasName>
            <IsAdmin>true</IsAdmin>
            <AdminServerHost>adminHost</AdminServerHost>
            <ClusterName>#NA</ClusterName>
            <MinHeap>512MB</MinHeap>
            <MaxHeap>2048MB</MaxHeap>
        </Server>
        <Server id = '2'>
            <Host>Host2</Host>
            <Port>14110</Port>
            <AliasName>managedserver01</AliasName>
            <IsAdmin>false</IsAdmin>
            <AdminServerHost>adminHost</AdminServerHost>
            <ClusterName>Cluster1</ClusterName>
            <MinHeap>512MB</MinHeap>
            <MaxHeap>2048MB</MaxHeap>
        </Server>
    </Servers>
</WebLogicDomain>

使用此属性文件,我可以轻松访问Domain&amp;环境属性但如何获取特定的服务器属性? 如果我需要获得$ {WebLogicDomain.Servers.Server [1] .Host},即主机出现在索引1,我该如何获得?

Follwoing并没有按预期工作。

<project name="SampleProject">
    <xmlproperty file="buildproperties.xml" />
    <target name="init">
        <echo> ******** XML property file has been loaded. ******** </echo>
        <echo> Domain name is : ${WebLogicDomain.Domain}</echo>
        <echo> Environment is : ${WebLogicDomain.Environment}</echo>
        <echo> First Server Details are : ${WebLogicDomain.Servers.Server[1].Host} </echo>
    </target>
</project>

当我运行init目标时,出现以下错误。

init:
     [echo]  ******** XML property file has been loaded. ********
     [echo]  Domain name is : MyDomain
     [echo]  Environment is : DEV
     [echo]  First Server Details are : ${WebLogicDomain.Servers.Server[1].Host}

1 个答案:

答案 0 :(得分:0)

当Ant的xmlproperty任务在同一位置找到多个具有相同名称的元素时,它会将它们作为逗号分隔列表保存到单个属性中。尝试使用xmlproperty任务查看构建已加载的所有属性以及相应的嵌套元素。遗憾的是,DOM信息大部分丢失了。您可以尝试依赖列出属性的顺序,使用正则表达式来提取相关信息,但这几乎肯定会很尴尬和不可靠。

<xmlproperty file="weblogic.xml" />

<echoproperties prefix="WebLogicDomain" />

输出:

[echoproperties] #Ant properties
[echoproperties] #Thu Feb 15 16:42:17 PST 2018
[echoproperties] WebLogicDomain.Domain=MyDomain
[echoproperties] WebLogicDomain.Environment=DEV
[echoproperties] WebLogicDomain.Servers.Server(id)=1,2
[echoproperties] WebLogicDomain.Servers.Server.AdminServerHost=adminHost,adminHost
[echoproperties] WebLogicDomain.Servers.Server.AliasName=adminserver,managedserver01
[echoproperties] WebLogicDomain.Servers.Server.ClusterName=\#NA,Cluster1
[echoproperties] WebLogicDomain.Servers.Server.Host=Host1,Host2
[echoproperties] WebLogicDomain.Servers.Server.IsAdmin=true,false
[echoproperties] WebLogicDomain.Servers.Server.MaxHeap=2048MB,2048MB
[echoproperties] WebLogicDomain.Servers.Server.MinHeap=512MB,512MB
[echoproperties] WebLogicDomain.Servers.Server.Port=14100,14110

如果您确实需要进行比基本字符串检索更复杂的XML解析,那么可以使用名为XmlTask​​的第三方插件来实现此目的。 http://www.oopsconsultancy.com/software/xmltask/

<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask">        
    <classpath location="lib/xmltask.jar"/>
</taskdef>

<target name="default">
    <xmltask source="weblogic.xml">
        <copy path="WebLogicDomain/Servers/Server[@id='1']/Host/text()" property="server.1.host"/>
    </xmltask>

    <echo message="${server.1.host}" />
</target>

输出:

  

[echo] Host1