我有一个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中出现两次或多次,我将无法获取它。
请帮忙。
答案 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}}命令组合的数量,可以减少/简化命令数量。这只是一个有效的解决方案。