次の提案があればありがとうございます。
何千もの.xmlファイルを含む「ABC」というフォルダがあります。 XMLのコア構造は同じです。
<product abcd…>
<category>
...
</category>
</product>
一部のxmlファイルは次のように考えることができます。効果的な必須タグが含まれているため<category>
)無効必須<category>
タグが完全に欠落しているためです。閉じない</category>
したがって、目的は、</category>
「ABC」フォルダ内のXMLにタグがない「無効な」xmlを端末経由で見つけることです。
どんな機会?
ベストアンサー1
すべてのXMLファイルの形式が正しいと仮定し、:を使用すると、次のように一致するxmlstarlet
すべてのファイルの入力ファイル名が出力されます。いいえ以下に直系の子category
ノードがありますproduct
。
xmlstarlet sel -t --if '/product/category' --else -f -nl ABC/*.xml
category
どこにもノードがないファイルのみを検索したい場合:
xmlstarlet sel -t --if '//category' --else -f -nl ABC/*.xml
両方のコマンドでxmlstarlet
指定されたXPath式が評価されます。式が見つかった1つ以上のノードのセットとして評価される場合、--if
テストは次のようになります。本物他のことは起こりません。それ以外の場合は、--else
ブランチが評価され、-f -nl
現在のファイル名が末尾の改行とともに出力されます。
ノードが欠落しているファイルに対していくつかの操作を実行すると仮定すると、category
以下は関連ファイルを処理できるループを設定します。
for xml in ABC/*.xml; do
if ! xmlstarlet sel -t --if '/product/category' -nl "$xml" >/dev/null
then
# process "$xml" here
fi
done
macOSへのインストールはxmlstarlet
Homebrewを介して行うのが最善です。 Homebrewパッケージを呼び出すxmlstarlet
とxml
。xmlstarlet