2014-08-27 130 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