如何忽略XMLStarlet中的空选择?

时间:2013-08-26 15:35:49

标签: suppress-warnings xmlstarlet

我有一个脚本,可以使用XMLStarlet执行许多XML编辑操作。 例如,它会删除所有foo个节点(如果存在):

xmlstarlet ed -d '//foo'

(除了在我的脚本中,元素的名称不是foo)。

如果没有foo节点,则会打印以下消息:

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

但如果输入文档中没有foo个节点,则没有错。 所以对于这个特定的操作,我确实想避免这个特别的警告, 虽然我一般不想禁用此类警告。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

目前,删除不存在的节点会被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来抑制此行为

更改是在this changeset中引入的,并且变更集包含有关此错误消息的长时间交换,所有这些都是由此StackOverflow问题引起的!