我有以下 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
)。