迭代/循环遍历XML节点列表

时间:2014-08-27 23:41:59

标签: xml shell xmllint

我需要加载一个XML文件并循环遍历其中的节点列表,以使用每个节点的属性作为脚本参数为每个节点执行shell脚本。有任何想法吗?任何帮助将不胜感激。

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>

1 个答案:

答案 0 :(得分: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