2

我有一个使用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但是,如果输入文档中不存在任何节点,则没有任何问题。所以对于这个特定的操作,我确实想避免这个特定的警告,而我一般不想禁用这样的警告。

我怎样才能做到这一点?

4

1 回答 1

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中已添加以抑制此行为

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

于 2013-12-13T11:38:23.360 回答