Davide Buoso
Davide Buoso

Reputation: 147

XMLStarlet delete parent node

I'm new using XMLStarlet and I'm wondering whether there is the possibility to remove a parent node that has a child with a specific value inside his tag.

In my example, I want to remove the node "<tabVisibilities>" that has inside a child node "<tab>" with the specfic value "SecondTab":

Starting XML:

<?xml version="1.0" encoding="UTF-8"?>
<Profile xmlns="http://soap.sforce.com/2006/04/metadata">
    <tabVisibilities>
        <tab>FirstTab</tab>
        <visibility>DefaultOn</visibility>
    </tabVisibilities>
    <tabVisibilities>
        <tab>SecondTab</tab>
        <visibility>DefaultOn</visibility>
    </tabVisibilities>
    <tabVisibilities>
        <tab>ThirdTab</tab>
        <visibility>DefaultOff</visibility>
    </tabVisibilities>
</Profile>

Expected XML:

<?xml version="1.0" encoding="UTF-8"?>
<Profile xmlns="http://soap.sforce.com/2006/04/metadata">
    <tabVisibilities>
        <tab>FirstTab</tab>
        <visibility>DefaultOn</visibility>
    </tabVisibilities>
    <tabVisibilities>
        <tab>ThirdTab</tab>
        <visibility>DefaultOff</visibility>
    </tabVisibilities>
</Profile>

Thank you very much, Davide.

Upvotes: 0

Views: 549

Answers (1)

Cyrus
Cyrus

Reputation: 88889

Your file uses namespaces.

xmlstarlet edit -N ns='http://soap.sforce.com/2006/04/metadata' --delete "//ns:tabVisibilities[ns:tab[contains(text(),'SecondTab')]]" file.xml

Output:

<?xml version="1.0" encoding="UTF-8"?>
<Profile xmlns="http://soap.sforce.com/2006/04/metadata">
  <tabVisibilities>
    <tab>FirstTab</tab>
    <visibility>DefaultOn</visibility>
  </tabVisibilities>
  <tabVisibilities>
    <tab>ThirdTab</tab>
    <visibility>DefaultOff</visibility>
  </tabVisibilities>
</Profile>

See: xmlstarlet edit --help

Upvotes: 3

Related Questions