2014-03-19 3 views
1

Ant에서 ReplaceRegExp 함수를 처음 사용하고 몇 가지 질문이 있습니다.Ant ReplaceRegExp Questions

여기가 나의 사용 사례입니다.

여러 개의 .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}에 속성을 변경하는 희망 : 그것은에 prefix3__으로 (하나 개의 <packageVersion> 노드가 있었다 파일에 올바른 일을

<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__ 노드로 바뀝니다. 난 와일드 카드를 사용하여 문제가 있다고 생각하지만 replaceregexp에 대한 정확한 해결책을 알기에는 충분하지 않습니다.

내가해야 할 일을 달성하기 위해 내가 할 수있는 것에 대한 아이디어가 있습니까?

도움을 주시면 감사하겠습니다.

답변

3

정규 표현식을 사용하여 XML을 구문 분석하는 경우는 fraught with problems이므로 피해야합니다.

대신 XMLTask을 사용해보십시오. XML을 파싱하고 수정하기위한 Ant 태스크입니다.

xmltask.jar을 다운로드하여 Ant lib 디렉토리에 넣으십시오.

아래는 Ant 스크립트의 일부입니다. <namespace> 요소의 형제 인 <minorNumber> 요소를 식별합니다. <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라는 이름의 파일을 이동해야하는 XML의 변형 된 곳으로 dest.xml-file 포인트라는 이름의 속성에 있다고 가정합니다.

+0

고맙습니다. 매우 유망 해 보입니다. 하나의 질문입니다,이 작품은 디렉토리에있는 여러 .xml 파일입니까? 아니면 모든 파일을 반복하고 각각에 대해이 작업을 수행 할 수있는 방법이 있습니까? –

+1

''은 하나의 호출로 여러 파일을 처리 할 수있는' '을 사용합니다 :'' –

+0

내가 이전에 찾은 것만으로도 도움이되었습니다. –