다음 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
).