我正在运行以下命令
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/