目前,删除不存在的节点被 xmlstarlet 归类为错误。返回代码将是1
您必须将其理解为“没有删除节点”。
如果您碰巧使用具有默认命名空间的文档,则会出现错误消息:
没有命名空间:
echo '<foo />' | xmlstarlet sel -t -m foo -v joe
使用默认命名空间 xmlstarlet 打印错误消息
echo '<foo xmlns="urn:foo" />' | xmlstarlet sel -t -m foo -v joe
None of the XPaths matched; to match a node in the default namespace
use '_' as the prefix (see section 5.1 in the manual).
For instance, use /_:node instead of /node
没有默认命名空间:
echo '<ns:foo xmlns:ns="urn:foo" />' | xmlstarlet sel -t -m foo -v joe
在所有这些情况下,都找不到节点,因此 xmlstarlet 退出并返回代码1
(即错误)。错误消息是在用户忘记文档具有默认命名空间的情况下解释错误。我已经与作者讨论过这个问题,最近引入了一些变化来减少这些消息的机会,以及一种抑制它们的方法。
xmlstarlet 支持(尚未记录)使用文档的命名空间,而无需预先声明它们:
相比:
echo '<ns:foo xmlns:ns="urn:foo" />' | xmlstarlet sel -t -m ns:foo -v 'count(.)'
echo '<ns:foo xmlns:ns="urn:foo" />' | xmlstarlet sel -N xx=urn:foo -t -m xx:foo -v 'count(.)'
从技术上讲,这些命令是相同的,除了第一个依赖于文档绑定到“ns”前缀,而第二个不依赖。
要禁止该消息,您必须将 stderr 重定向到 null:
echo '<foo xmlns="urn:xxx"/>' |
xmlstarlet sel -t -m foo -v joe 2> /dev/null
这样做的缺点是它会抑制合法的错误消息,而不仅仅是由于源文档使用名称空间这一事实而导致的虚假错误消息。
在最近的版本--no-doc-namespace
中已添加以抑制此行为
此变更集中引入了更改,并且变更集包含有关此错误消息的长时间交流,所有这些都是由这个 StackOverflow 问题引起的!