小星星 |删除具有指定值的条目

Xmlstarlet | remove entry with specified value

我有这样的东西

<?xml version="1.0"?>
<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN" "http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd">
<Menu>
  <Menu>
    <Name>Personal</Name>
    <Directory>xfce-personal.directory</Directory>
    <Include>
      <And>
        <Category>Settings</Category>
        <Category>X-XFCE-SettingsDialog</Category>
        <Category>X-XFCE-PersonalSettings</Category>
      </And>
      <Filename>brightness-frontend.desktop</Filename>
      <Filename>xscreensaver-properties.desktop</Filename>
    </Include>
  </Menu>
</Menu>

我想删除

 <Filename>brightness-frontend.desktop</Filename>

尝试运行 xmlstartlet

/usr/bin/xmlstarlet ed -d  "//Include[Filename='brightness-frontend.desktop']"  /tmp/1.xml

但删除所有包含部分,以及所有子项。如何仅删除具有 brightness-frontend.desktop 值的 Filename 节点?

XPath 查询 //Include[Filename='...'] 将匹配 Include 节点本身,其中包括其下的所有子节点。请注意 Filename 是一个单独的 XML 元素,而不是 Include 属性上的 属性。

而是使用基于其文本匹配 Filename 属性的 XPath 查询:

//Filename[text()='brightness-frontend.desktop']