【问题标题】:Iterate/Loop Through XML Node List通过 XML 节点列表迭代/循环
【发布时间】:2014-08-28 18:46:14
【问题描述】:

我需要加载一个 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>

【问题讨论】:

  • 你不能在一个普通的文本文件中输入两行,然后用while read line ; do eval $line ; done &lt; $file 处理它吗?祝你好运。

标签: xml shell xmllint


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2013-01-14
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多