2014-08-27 2 views
0

Мне нужно загрузить XML-файл и перебрать список узлов в нем, чтобы выполнить сценарий оболочки для каждого из них, используя атрибуты для каждого узла в качестве параметров для скрипта. Есть идеи? Любая помощь будет высоко ценится.Iterate/Loop Through XML Node List

Пример XML-файл:

<Config> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>60</TIMEOUT> 
<COMMAND>/opt/test1.sh</COMMAND> 

<FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>30</TIMEOUT> 
    <COMMAND>/opt/test2.sh</COMMAND> 
</Config> 
+0

Не можете вы просто сделать 2 линии ввода в обычном текстовом файле и затем обработать с 'while read line; do eval $ line; done <$ file'? Удачи. – shellter

ответ

1

Самое простое решение включает правку в файл XML: содержат частоты/тайм-аут/командные тег внутри другого тега:

xmlstarlet sel -t -m /Config/x -v FREQUENCY -o : -v TIMEOUT -o : -v COMMAND -nl <<END 
<Config> 
    <x> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>60</TIMEOUT> 
    <COMMAND>/opt/test1.sh</COMMAND> 
    </x> 

    <x> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>30</TIMEOUT> 
    <COMMAND>/opt/test2.sh</COMMAND> 
    </x> 
</Config> 
END 
EVERYTIME:60:/opt/test1.sh 
EVERYTIME:30:/opt/test2.sh 

В противном случае, если ваш xml-файл является простым (и I loathe с использованием инструментов обработки текста на xml):

awk -F '[<>]' -v OFS=: ' 
    $2 == "FREQUENCY" {f=$3} 
    $2 == "TIMEOUT" {t=$3} 
    $2 == "COMMAND" {c=$3} 
    f && t && c {print f,t,c; f=t=c=""} 
' <<END 
<Config> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>60</TIMEOUT> 
    <COMMAND>/opt/test1.sh</COMMAND> 

    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>30</TIMEOUT> 
    <COMMAND>/opt/test2.sh</COMMAND> 
</Config> 
END 
EVERYTIME:60:/opt/test1.sh 
EVERYTIME:30:/opt/test2.sh 

В любом случае, вы можете перенаправить вывод в:

... | while IFS=: read freq timeout cmd; do 
    something with "$freq" "$timeout" "$cmd" 
done