쉘 스크립트를 사용하여 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하고 세 번째 필드를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).

관련 정보