我是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>
如何更新&amp;属性只包含前缀“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还不太了解,无法确定正确的解决方案。
关于我能做些什么来实现我需要做的事情的任何想法?
任何帮助表示感谢。
答案 0 :(得分:3)
使用正则表达式解析XML是fraught with problems,最好避免使用。
相反,请考虑使用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的位置。