XMLStarlet 删除父节点

问题描述

我是 XMLStarlet 的新手,我想知道是否有可能删除一个父节点,该父节点在其标签中具有一个具有特定值的子节点。

在我的示例中,我想删除在子节点“”内具有特定值“” >SecondTab":

开始 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>

预期的 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>

非常感谢,大卫。

解决方法

您的文件使用命名空间。

xmlstarlet edit -N ns='http://soap.sforce.com/2006/04/metadata' --delete "//ns:tabVisibilities[ns:tab[contains(text(),'SecondTab')]]" file.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>

见:xmlstarlet edit --help