Shell脚本,用于获取XML中多次出现的节点的值

时间:2016-08-08 12:07:46

标签: shell

我有一个XML如下:

<artifact>
   <a>1.zip</a>
   <b>2-SNAPSHOT.zip</b>
   <c>3-SNAPSHOT.zip</c>
</artifact>
<artifact>
   <a>4.tar</a>
   <b>5.tar</b>
   <c>6.tar</c>
</artifact>

我的要求是获取节点“artifact”的第二个外观中出现的值“5.tar”。如果此节点在XML中只出现一次,我可以获取值。但是,如果同一节点在同一XML中出现两次或多次,我将无法获取它。

请帮忙。

1 个答案:

答案 0 :(得分:0)

我会打破我尝试使用xmllint

的答案
BuildResult.xml

我已通过添加<root>个节点并添加专有标头信息来格式化原始$ xmllint -format BuildResult.xml <?xml version="1.0" standalone="yes"?> <root> <artifact> <a>1.zip</a> <b>2-SNAPSHOT.zip</b> <c>3-SNAPSHOT.zip</c> </artifact> <artifact> <a>4.tar</a> <b>5.tar</b> <c>6.tar</c> </artifact> </root> 文件,以避免任何解析错误: -

//root/artifact/b

执行的步骤: -

启动文件从根节点解析到重复节点(xmllint)并以交互式shell模式运行xmllint --shell/ > ------- <b>2-SNAPSHOT.zip</b> ------- <b>5.tar</b> / >

明确地运行命令会产生一个结果,

sed

现在使用sed '/^\/ >/d' | sed 's/<[^>]*.//g'删除特殊字符,即2-SNAPSHOT.zip ------- 5.tar 生成

tr

现在使用awk从上述命令中删除换行符,以便-------可以使用字段分隔符2-SNAPSHOT.zip -------5.tar

处理记录
awk

上面输出的awk -F"-------" '{print $2}命令将根据需要生成文件; 5.tar

#!/bin/bash

newVar=$(echo "cat //root/artifact/b" |  xmllint --shell BuildResult.xml | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | tr -d '\n' | awk -F"-------" '{print $2}')
echo "$newVar"

将它放在shell脚本中,看起来像

awk

P.S: - 通过减少sed / {{1}}命令组合的数量,可以减少/简化命令数量。这只是一个有效的解决方案。