我对Ant中的ReplaceRegExp函数不熟悉,有一些问题。
这是我的用例。
我有多个.xml文件,我需要以特定的方式操作它们。
下面是一个。xml内容的例子:
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>29.0</apiVersion>
<packageVersions>
<majorNumber>1</majorNumber>
<minorNumber>1228</minorNumber>
<namespace>prefix1__FirstNamespace</namespace>
</packageVersions>
<packageVersions>
<majorNumber>2</majorNumber>
<minorNumber>4</minorNumber>
<namespace>prefix2__TheNextNamespace</namespace>
</packageVersions>
<packageVersions>
<majorNumber>7</majorNumber>
<minorNumber>542</minorNumber>
<namespace>prefix3__AnotherNamespace</namespace>
</packageVersions>
<status>Active</status>
</ApexClass>
如何更新&只有属性中包含前缀"prefix3"的属性?
我已经尝试了这个函数,希望将属性更改为${correctMinorNumber}指定的值:
<target name="setminorNumber">
<replaceregexp flags="gis"
match="<minorNumber>?(.*)</minorNumber>?(.+?)<namespace>prefix3__</namespace>"
byline="false"
>
<substitution expression="<minorNumber>${correctMinorNumber}</minorNumber> 		<namespace>prefix3__</namespace>"/>
<fileset dir="${sf.retrieveFolder}">
<include name="**/*.xml"/>
</fileset>
</replaceregexp>
</target>
它在只有一个<packageVersion>
节点(名称空间中有prefix3__)的文件上工作正确,但是在包含多个<packageVersion>
节点的文件上,它用一个prefix3__节点替换所有节点。我猜问题在于我使用通配符,但我对replaceregexp的了解不够,无法确定正确的解决方案。
有什么想法,我可以做什么来实现我需要做的吗?
感谢您的帮助。
用正则表达式解析XML充满了问题,最好避免。
可以考虑使用XMLTask。这是一个专门用于解析和修改XML的Ant任务。
下载xmltask.jar放到Ant lib
目录下。
下面是Ant脚本的一部分。它标识<minorNumber>
元素,这些元素是<namespace>
元素的兄弟元素,其中<namespace>
元素具有以字符串prefix3__
开头的文本节点。然后它替换<minorNumber>
元素下的文本节点:
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" />
<xmltask dest="${dest.xml-file}">
<fileset file="src.xml"/>
<replace
path="//:packageVersions[starts-with(:namespace/text(), 'prefix3__')]/:minorNumber/text()"
withText="${correctMinorNumber}"
/>
</xmltask>
此脚本假设XML位于名为src.xml
的文件中,并且名为dest.xml-file
的属性指向XML的修改位置。