2014-03-19 104 views
1

我是新來的Ant中的ReplaceRegExp函數,並且有一些問題。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="&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__文件名稱空間),但是在包含多個節點的文件上,它會用一個prefix3__節點替換所有節點。我猜猜問題在於我使用了通配符,但我不知道replaceregexp來確定正確的解決方案。

關於我能做些什麼來實現我需要做的任何想法?

任何幫助表示讚賞。

回答

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的應該去屬性。

+0

謝謝你,這看起來很有希望!一個問題,這項工作將在一個目錄中多個.xml文件?或者有沒有辦法遍歷所有文件併爲每個文件運行此任務? –

+1

''需要一個'',它可以用一次調用處理多個文件:'' –

+0

是的,我之前發現的和它的工作,感謝一百萬人的幫助! –