xmlstarlet - 尝试使用 xmlstarlet 删除元素但似乎没有做任何事情

标签 xmlstarlet

我正在运行以下命令

xmlstarlet ed -d "/Package/types[name='ApexEmailNotifications']" test.xml

针对以下 XML

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  <types>
    <members>1</members>
    <name>ApexEmailNotifications</name>
  </types>
  <types>
    <members>2</members>
    <name>ApexTrigger</name>
  </types>
  <types>
    <members>3</members>
    <members>4</members>
    <name>AppMenu</name>
  </types>
  <version>50.0</version>
</Package>

预计会变成下面这样

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  <types>
    <members>2</members>
    <name>ApexTrigger</name>
  </types>
  <types>
    <members>3</members>
    <members>4</members>
    <name>AppMenu</name>
  </types>
  <version>50.0</version>
</Package>

但是什么也没发生,我只是觉得我在这里或那里错过了一个愚蠢的角色​​,或者误解了手册页。

任何帮助将非常感谢我剩下的头发

最佳答案

XML 命名空间通常使事情变得困难。这就是您在 xmlstarlet 中必须做的事情:声明命名空间(下面的 _ 没有什么神奇之处,它只是一个名称),然后为每个标签使用前缀

xmlstarlet ed \
    -N _=http://soap.sforce.com/2006/04/metadata \
    -d "/_:Package/_:types[_:name = 'ApexEmailNotifications']" \
    test.xml

结果

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  <types>
    <members>2</members>
    <name>ApexTrigger</name>
  </types>
  <types>
    <members>3</members>
    <members>4</members>
    <name>AppMenu</name>
  </types>
  <version>50.0</version>
</Package>

正如 Daniel Haley 所评论的,由于命名空间适用于根元素,因此对于 xmlstarlet,我们可以使用 _ 前缀,不使用 -N版本 >= 1.2.1

xmlstarlet ed -d "/_:Package/_:types[_:name = 'ApexEmailNotifications']"  test.xml

1.5.0 版本出于相同目的提供了 DEFAULT

xmlstarlet ed -d "/DEFAULT:Package/DEFAULT:types[DEFAULT:name = 'ApexEmailNotifications']"  test.xml

关于xmlstarlet - 尝试使用 xmlstarlet 删除元素但似乎没有做任何事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64990563/

相关文章:

bash - xmlstarlet -v 到 $variable

xmlstarlet 选择值

xpath - 使用XMLStarlet删除属性

xml - 使用 xmlstarlet 选择 xmlns 属性

xml - 在xml中拆分字符串

xmlstarlet 根据条件选择值

xmlstarlet 附加到 XML 中的节点

html - 使用 xpath 从格式不正确的页面解析 XML

xpath - 为什么 xmlstarlet 说没有 'ends-with' 函数?

xml - 如何过滤 XMLStarlet 中的多个属性?