Ant ReplaceRegExp问题

时间:2014-03-19 11:02:32

标签: xml ant force.com

我是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="&lt;minorNumber&gt;?(.*)&lt;/minorNumber&gt;?(.+?)&lt;namespace&gt;prefix3__&lt;/namespace&gt;"
                    byline="false"
        >
        <substitution expression="&lt;minorNumber&gt;${correctMinorNumber}&lt;/minorNumber&gt;&#10;&#9;&#9;&lt;namespace&gt;prefix3__&lt;/namespace&gt;"/>
        <fileset dir="${sf.retrieveFolder}">
            <include name="**/*.xml"/>
        </fileset>
    </replaceregexp>
</target>

它在只有一个<packageVersion>节点(命名空间中带有prefix3__)的文件上工作正常,但在包含多个<packageVersion>节点的文件上,它用一个prefix3__节点替换所有节点。我猜这个问题在于我使用了通配符,但是我对replaceregexp还不太了解,无法确定正确的解决方案。

关于我能做些什么来实现我需要做的事情的任何想法?

任何帮助表示感谢。

1 个答案:

答案 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的位置。