シェルスクリプトを使用してXMLファイルタグ「AssetId」と関連サブタグを解析する必要がありますか?

シェルスクリプトを使用してXMLファイルタグ「AssetId」と関連サブタグを解析する必要がありますか?

次のXMLがあり、シェルでいくつかのメソッドを使用して「AssetId」を解析/選択したいと思います。

<?xml version="1.0" encoding="UTF-8"?>
<ns0:EcomAssetMetadataTransaction xmlns:ns0="http://www.DDDDD.com/IntegrationObjects/EcomAssetMetadata/1.0.0" xmlns:ns2="http://www.DDDDD.com/ICC/Types/MetaData/1.0">
<TransactionMetaData>
<ns2:SourceSystemName>FFFF</ns2:SourceSystemName>
<ns2:TransactionType>EcomAssetMetadata</ns2:TransactionType>
<ns2:UniqueTransactionID>3c1bffed-a914-457d-9e20-f07efb09d0ec</ns2:UniqueTransactionID>
<ns2:TransactionDateTime>2017-09-11T15:46:42.134+02:00</ns2:TransactionDateTime>
</TransactionMetaData>
<Payload>
<EcomAssetMetadatas>
<EcomAssetMetadata>
<Data>
<AssetId>229a916d778148de71522e6870822b5f841c794b</AssetId>
<AssetType>StillMediaComponents/Lookbook</AssetType>
<Version>1</Version>
<FileLocation>LiquidPixels</FileLocation>
<FilePath>22/9a/229a916d778148de71522e6870822b5f841c794b.jpg</FilePath>
<Brand>DDDDD</Brand>
<AllowedForUse>true</AllowedForUse>
<MainArticles>
<Article>
<ProductId>0515769</ProductId>
<ArticleId>003</ArticleId>
</Article>
</MainArticles>
<SubordinateArticles>
<Article>
<ProductId>0544951</ProductId>
<ArticleId>001</ArticleId>
</Article>
</SubordinateArticles>
<Angle>
<Facing>1</Facing>
<Identifier>C</Identifier>
<Packaging>0</Packaging>
<Number>1</Number>
</Angle>
<IsMultiPack>false</IsMultiPack>
</Data>
</EcomAssetMetadata>
</EcomAssetMetadatas>
</Payload>
</ns0:EcomAssetMetadataTransaction>

答え1

オプション1:awkを使う

awk -F '[<>]' '/AssetId/ {a=$3;next} /AllowedForUse/ {print FILENAME":"a":"$3}' *.xml

出力:

test1.xml:229a916d778148de71522e6870822b5f841c794b:true
test.xml:229a916d778148de71522e6870822b5f841c794b:true
  • パターンを検索AssetIdして3番目のフィールドa
  • 次にパターンを検索しAllowedForUse、ファイル名とともに3番目のフィールドを印刷します。a

オプション2:xmlstarletの使用

for i in `ls -f *.xml`
do
        ID=`xmlstarlet sel -T -t -m /ns0:EcomAssetMetadataTransaction/Payload/EcomAssetMetadatas/EcomAssetMetadata/Data/AssetId -v . -n  $i`
        STATUS=`xmlstarlet sel -T -t -m /ns0:EcomAssetMetadataTransaction/Payload/EcomAssetMetadatas/EcomAssetMetadata/Data/AllowedForUse -v . -n $i`
        echo -e "$i,$ID,$STATUS"
done

答え2

以下は、XMLパーサーに付属のプログラミング言語(ruby)を使用したXML解析の例です。

ruby -e '
  require "rexml/document"
  file = File.new ARGV.shift
  doc = REXML::Document.new file
  REXML::XPath.each(doc, "//Data") do |elem|
    puts elem.elements["AssetId"].text
    puts elem.elements["AllowedForUse"].text
  end
' file.xml

答え3

使用xmlstarlet:

$ xmlstarlet sel -t -v '//AssetId' -nl file.xml
229a916d778148de71522e6870822b5f841c794b

またはxq

$ xq -r '.. | .AssetId? // empty' file.xml
229a916d778148de71522e6870822b5f841c794b

AssetIdこれにより、文書内のすべてのノード値が抽出されます。ドキュメント内のノードの正確なパスはですが、/ns0:EcomAssetMetadataTransaction/Payload/EcomAssetMetadatas/EcomAssetMetadata/Data/AssetIdこれが必要かどうかはわかりません(ノードが1つしかない場合AssetId)。

関連情報