2014-01-22 5 views
3

셸 스크립트에서 다음과 같이 xml 파일을 p.xml로 가져와 파싱하고 두 개의 배열로 값을 가져 오려고합니다. xmllint를 사용하려고하는데 원하는 데이터를 얻을 수 없습니다.xmllint를 사용하여 xml을 구문 분석하고 배열에 저장하는 방법

<?xml version="1.0" encoding="UTF-8"?> 
    <Share_Collection> 
     <Share id="data/Backup" resource-id="data/Backup" resource-type="SimpleShare" share-name="Backup" protocols="cifs,afp"/> 
     <Share id="data/Documents" resource-id="data/Documents" resource-type="SimpleShare" share-name="Documents" protocols="cifs,afp"/> 
     <Share id="data/Music" resource-id="data/Music" resource-type="SimpleShare" share-name="Music" protocols="cifs,afp"/> 
     <Share id="data/OwnCloud" resource-id="data/OwnCloud" resource-type="SimpleShare" share-name="OwnCloud" protocols="cifs,afp"/> 
     <Share id="data/Pictures" resource-id="data/Pictures" resource-type="SimpleShare" share-name="Pictures" protocols="cifs,afp"/> 
     <Share id="data/Videos" resource-id="data/Videos" resource-type="SimpleShare" share-name="Videos" protocols="cifs,afp"/> 
    </Share_Collection> 

나는 배열 모든 ID 공유 한 배열을 포함하는 공유 이름을 얻으려면.

xmllint --xpath '//Share/@id' p.xml 
xmllint --xpath '//Share/@share-name' p.xml 

id="data/Backup" 
id="data/Documents" id="data/Music" id="data/OwnCloud" id="data/Pictures" id="data/Videos" 

을 이해할 수있을 것이다 두 배열을 구축하기 위해 어떤 도움을 제공한다 : 나는 다음과 같이 시작

share-ids-array = ["data/Backup", "data/Documents", "data/Music", "data/OwnCloud", "data/Pictures", "data/Videos"]  

share-names-array = ["Backup", "Documents", "Music", "OwnCloud", "Pictures", "Videos"] 

같은 두 배열이 될 것입니다.

답변

6

grep (및 tr)을 사용하는 한 가지 해결책은 ... sed 또는 awk은 다른 대안입니다. 그런데 bash에서는 변수 이름에 하이픈을 사용할 수 없습니다.

share_ids=($(xmllint --xpath '//Share/@id' p.xml | grep -Po '".*?"' | tr -d \")) 
share_names=($(xmllint --xpath '//Share/@share-name' p.xml | grep -Po '".*?"' | tr -d \")) 

예 :

$ echo ${share_names[@]} 
Backup Documents Music OwnCloud Pictures Videos 

xmlstarlet를 사용하지만, 아마도 더 :

share_names=($(xmlstarlet sel -T -t -m '//Share/@share-name' -v '.' -n p.xml)) 
관련 문제