我有一个xml文件,其内容类似于以下内容:
<tag>
<sub>...</sub>
<msg>....</msg>
</tag>
<tag>
<sub>...</sub>
</tag>
<tag>
<sub>...</sub>
<msg>....</msg>
</tag>
<tag>
<sub>...</sub>
</tag>
<tag>
<sub>...</sub>
<msg>....</msg>
</tag>
<tag>
<sub>...</sub>
</tag>
我需要一个shell脚本来浏览整个xml文件并在每个<tag>...</tag>
内执行搜索。如果<tag>
存在,则在每个<msg>
内执行操作1,如果<msg>
不存在则执行操作2.如何执行此操作?
答案 0 :(得分:0)
这听起来像是XSLT
的工作鉴于此test.xml:
<document>
<tag n="1">
<sub>...</sub>
<msg>....</msg>
</tag>
<tag n="2">
<sub>...</sub>
</tag>
<tag n="3">
<sub>...</sub>
<msg>....</msg>
</tag>
<tag n="4">
<sub>...</sub>
</tag>
<tag n="5">
<sub>...</sub>
<msg>....</msg>
</tag>
<tag n="6">
<sub>...</sub>
</tag>
</document>
以下是一些xpath表达式的示例
“tag”标签,其中包含“msg”子级
$ xmlstarlet sel -t -v '//tag[msg]/@n' test.xml
1
3
5
没有“msg”孩子的“tag”标签
$ xmlstarlet sel -t -v '//tag[not(msg)]/@n' test.xml
2
4
6
答案 1 :(得分:0)
cat tagfile|awk 'BEGIN{ORS=" ";} {print;}'|sed 's@</tag>@&\n@g'>tempfile
while read line
do
echo $line|grep -i "<msg>">/dev/null
if [ $? -eq 0 ] then
Action1
else
Action2
fi
done<tempfile