[英]How to get XMLLINT to put --xpath results as an array
我希望将 XMLLINT 的输出放入 BASH 数组中。 但我能得到的只是一个字符串。 结果将返回许多命中,没有任何可以帮助解析返回字符串的模式。
//
并且只有一个/
<?xml version="1.0" encoding="UTF-8"?>
<root>
<instance>
<absolutePath>/abc/def</absolutePath>
</instance>
<instance>
<absolutePath>/abc/hij</absolutePath>
</instance>
</root>
#!/usr/bin/bash
declare -a wwArray=()
wwCount=$(xmllint --xpath 'count(//absolutePath)' "mcv.xml")
printf "wwCount: '%s' \n" ${wwCount}
i=1
while [ $i -le ${wwCount} ];
do
wwExtracted=$(xmllint --xpath '//absolutePath['${i}']/text ()' "mcv.xml")
printf " - absolutePath: '%s' \n" ${wwExtracted}
printf " - index: '%d' \n" ${i}
let i=i+1
done
运行这个,输出是:
wwCount: '2'
- absolutePath: '/abc/def/abc/hij'
- index: '1'
XPath set is empty
- absolutePath: ''
- index: '2'
...而我希望它是:
wwCount: '2'
- absolutePath: '/abc/def'
- index: '1'
- absolutePath: '/abc/hij'
- index: '2'
使现有代码工作所需的最小更改是在[$i]
之前添加括号,如下所示:
#!/usr/bin/bash
wwCount=$(xmllint --xpath 'count(//absolutePath)' "mcv.xml")
for ((i=1; i<=wwCount; i++)); do
wwExtracted=$(xmllint --xpath '(//absolutePath)['"$i"']/text()' "mcv.xml")
printf " - absolutePath: '%s' \n" "$wwExtracted"
printf " - index: '%d' \n" "$i"
done
也就是说,这确实效率低下(一遍又一遍地运行 XPath)。 考虑从xmllint
切换到使用 XMLStarlet,它可以被指示在输出元素之间插入换行符,因此您可以告诉 bash 将这些项目直接加载到真正的 shell 数组中:
#!/usr/bin/bash
readarray -t items < <(xmlstarlet sel -t -m '//absolutePath' -v './text()' -n <mcv.xml)
printf ' - absolutePath: %s\n' "${items[@]}"
将内容放入数组后(由上面的readarray
创建),您还可以按索引进行迭代:
for idx in "${!items[@]}"; do
printf ' - absolutePath: %s\n' "${items[$idx]}"
printf ' - index: %s\n' "$idx"
done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.