2014-08-27 134 views
0

我需要加載一個XML文件並循環遍歷其中的節點列表,以便爲每個節點使用每個節點的屬性作爲該腳本的參數執行一個shell腳本。有任何想法嗎?任何幫助都感激不盡。 XML文件的通過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';做eval $行;完成<$ file'?祝你好運。 – shellter 2014-08-28 02:43:56

回答

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文件是這樣簡單的(而我厭惡在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