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' プレフィックスへのドキュメント バインディングに依存し、2 番目のコマンドはそうではありません。

メッセージを禁止するには、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 に答える