如何使用ant更新XML中的多个组件

时间:2013-10-31 18:51:06

标签: xml ant

我想使用ant

更新以下xml文件中的Regist和Manage组件中的数值

XML: -

<?xml version="1.0" encoding="UTF-8" ?>  
<Application>  
<component>  
<name>Regist</name>  
<filename>v1.5.0.4-Regist.zip</filename>  
<version>v1.5.0.4</version>  
<size>1001518</size>  
</component>  
<component>
<name>Manage</name>  
<filename>v1.5.1.1-manage.jar</filename>  
<version>v1.5.1.1</version>  
<size>3795024</size>  
</component>  
</Application>  

Ant能够遍历脚本但由于上述结构而无法区分组件。它将上述xml组件标识为以下属性

Application.component.filename=v1.5.0.4-Regist.zip,v1.5.1.1-manage.jar   
Application.component.name=Regist,Manage   
Application.component.size=1001518,3795024   
Application.component.version=v1.5.0.4,v1.5.1.1   

我们正在单独运行组件注册和管理,新值将更新为此XML

有没有办法通过ant拉出关于组件的属性?

1 个答案:

答案 0 :(得分:2)

听起来我需要使用XPath来唯一标识每个组件。首先,there is a related SO question。我想你不知道search for Xpath, because that's what will help you in this situation。不过,我将在这个答案中总结一些选项。

xmltask

看起来是最好的选择。将XML值拉入属性:

<xmltask source="map.xml">
  <!-- copies to a property 'user' -->
  <copy path="/map/entry[@key='database.user']/@value" attrValue="true" property="user"/>
</xmltask>

ant-xpath-task

它看起来似乎可以将XML中的值从系统属性中提取出来,但文档非常缺乏:

<target name="find-hrefs">
  <xpath document="foo.xhtml" xpath="/html/body/a/@href" outputproperty="hrefs"/> 
</target>

Script Engine via Ant

在相关的SO问题中提到了这一点。它在答案中使用Javascript从XML中提取数据并将其存储在系统属性中。现在,也许您可​​以使用Groovy或Scala脚本引擎支持更简洁的语法。

Core style ant task

使用XSLT to perform manipulation on XML。这无助于您从我认为的XML中提取值,但您可能需要更改某些值或节点。