現時点では、存在しないノードを削除すると、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' プレフィックスへのドキュメント バインディングに依存し、2 番目のコマンドはそうではありません。
メッセージを禁止するには、stderr を null にリダイレクトする必要があります。
echo '<foo xmlns="urn:xxx"/>' |
xmlstarlet sel -t -m foo -v joe 2> /dev/null
これの欠点は、ソース ドキュメントが名前空間を使用するという事実によって引き起こされるこの偽のエラー メッセージだけでなく、正当なエラー メッセージを抑制することです。
最近のビルド--no-doc-namespace
では、この動作を禁止するために追加されました
変更はこの変更セットで導入され、変更セットにはこのエラー メッセージに関する長い交換が含まれています。これはすべて、この StackOverflow の質問が原因です!