Sami
Sami

Reputation: 564

Ant: Remove multiple lines if keyword match

I have an XML file which contains the following:

  <feature name="Notification">
        <param name="android-package" value="org.apache.cordova.dialogs.Notification" />
    </feature>    
    <feature name="FileTransfer">
        <param name="android-package" value="org.apache.cordova.filetransfer.FileTransfer" />
    </feature>
    <feature name="Capture">
        <param name="android-package" value="org.apache.cordova.mediacapture.Capture" />
    </feature>
    <feature name="Battery">
        <param name="android-package" value="org.apache.cordova.batterystatus.BatteryListener" />
    </feature>

How can I delete a full <feature> tag based on its name using Ant script?

For example: If "Battery" is found in the xml, delete the following:

<feature name="Battery">
        <param name="android-package" value="org.apache.cordova.batterystatus.BatteryListener" />
    </feature>

Upvotes: 0

Views: 89

Answers (1)

Mark O&#39;Connor
Mark O&#39;Connor

Reputation: 77991

Ant can use a XSLT stylesheet to process XML files.

Example

├── build.xml
├── data.xml
├── process.xsl
└── target
    └── output.xml

build.xml

<project name="demo" default="build">

    <target name="init">
        <mkdir dir="target"/>
    </target>

    <target name="build" depends="init">
        <xslt style="process.xsl" in="data.xml" out="target/output.xml"/>
    </target>

    <target name="clean">
        <delete dir="target"/>
    </target>

</project>

process.xsl

Notice how an Xpath expression is used to filter out the feature tags name "Battery":

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml"/>

    <xsl:template match="/data">
        <data>
            <xsl:apply-templates select="feature[@name!='Battery']"/>
        </data>
    </xsl:template>

    <xsl:template match="feature">
        <xsl:copy-of select="."/>
    </xsl:template>

</xsl:stylesheet>

data.xml

<data>
 <feature name="Notification">
        <param name="android-package" value="org.apache.cordova.dialogs.Notification" />
    </feature>    
    <feature name="FileTransfer">
        <param name="android-package" value="org.apache.cordova.filetransfer.FileTransfer" />
    </feature>
    <feature name="Capture">
        <param name="android-package" value="org.apache.cordova.mediacapture.Capture" />
    </feature>
    <feature name="Battery">
        <param name="android-package" value="org.apache.cordova.batterystatus.BatteryListener" />
    </feature>
</data>

target/output.xml

The formatted result:

<data>
  <feature name="Notification">
    <param name="android-package" value="org.apache.cordova.dialogs.Notification"/>
  </feature>
  <feature name="FileTransfer">
    <param name="android-package" value="org.apache.cordova.filetransfer.FileTransfer"/>
  </feature>
  <feature name="Capture">
    <param name="android-package" value="org.apache.cordova.mediacapture.Capture"/>
  </feature>
</data>

Upvotes: 1

Related Questions