需要使用 shell 脚本解析 XML 文件标签“资产 Id”和关联的子标签?

需要使用 shell 脚本解析 XML 文件标签“资产 Id”和关联的子标签?

我有以下 XML,我想使用 shell 中的某种方法来解析/选择“资产 Id”。

<?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并将第三个字段保存在a
  • 然后搜索模式AllowedForUse并打印第三个字段以及文件名和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,但尚不清楚是否需要这一路径(如果只有一个节点则不然AssetId)。

相关内容