我有一个脚本,可以使用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
个节点,则没有错。
所以对于这个特定的操作,我确实想避免这个特别的警告,
虽然我一般不想禁用此类警告。
我怎样才能做到这一点?
答案 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问题引起的!