このディスカッションでは、いくつかの優れたコマンドライン XML 操作ツールを見ました。また、コンパイル済みプログラムの代わりにスクリプトを使用して、XML ファイルからデータを抽出する新しい方法を模索しています。現在xmlstarletを試していますが、このツールの使用に制限されていません。
何万もの要素を含む XML データ ファイルがあります。検索用語のリストに基づいてこれらの要素のサブセットを抽出し、それらの要素を下流のスクリプトや変換にパイプするか、別の方法でルーティングしたいと考えています。検索用語は単純な文字列です。正規表現は必要ありません。通常のテキスト ファイルに対して grep を使用してこれを行っていた場合、おそらく次のような単純なことを行うでしょう。
grep -Ff StringsToSearchFor.txt MassiveFile.txt | [chain of additional commands]
これを達成する方法について xmlstarlet などのツールのドキュメントを調べてきましたが、思いつく最も近いものは、一時ファイルを使用するこの醜い試みです。(注、私はWindowsを使用しています):
REM Create tempOutput.xml, with an open root node
REM %1 is the file containing the list of strings
REM %2 is the target XML file
for /F %%A in (%1) do (
REM Search for a single matching node, and append the output to tempOutput.xml
xml sel -I -t -c "path/to/search[targetElement='%%A']" %2 >> tempOutput.xml
)
REM Close root node to tempOutput.xml
REM After this stage, pass tempOutput.xml as the input to downstream XML transforms and tools
言うまでもなく、これは本当に醜いです。
-c
XPath クエリの膨大なリストを一度に xmlstarletに渡すように for ループを変更することも 1 つの可能性だと思いますが、これも不必要に面倒で、まだ tempOutput.xml ファイルの使用に行き詰まると思います。
これを行うよりエレガントな方法はありますか?または、一時ファイルは本当に私の最善のアプローチですか?