2014-01-22 4 views
3

В сценарии оболочки у меня есть xml-файл как p.xml, как показано ниже, и я хочу его проанализировать и получить значения в двух массивах. Я пытаюсь использовать xmllint, но не могу получить желаемые данные.Как анализировать xml с помощью xmllint и хранить в массивах

<?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> 

Я хочу получить массив всех идентификаторов доступа и один массив, содержащий общие имена. Таким образом, два массива будет как

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

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

Я начал следующим образом:

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" 

Любая помощь, чтобы построить эти два массива будут оценены.

ответ

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)) 
Смежные вопросы