gpt4 book ai didi

xml - 使用Shell脚本从xml获取元素并将其存储在数组中

转载 作者:行者123 更新时间:2023-12-03 16:52:56 25 4
gpt4 key购买 nike

我有我的xml像:

<URLS xmlns:"http://www.example.com">
<Service>
<forwardUrl>
<value>http://www.example1.com:80</value>
<value>http://www.example2.com:80</value>
.
.
.
</forwardUrl>
</Service>
</URLS>


我想将所有转发网址存储在一个数组中。

我尝试这样做:

let urlcount=$(sed -e "s/xmlns/ignore/" /tmp/in.xml | xmllint --xpath "count(//forwardUrl/value)"  -)
declare -a urls=()

for((i=1; i <= $urlcount; i++)); do
echo $i
urls[$i]=$(sed -e "s/xmlns/ignore/" /tmp/in.xml | xmllint --xpath '//forwardUrl/value["$i"]/text()' -)
done


但是当我执行 echo ${urls[7]}时,它会打印所有值。

我想在不同的索引中存储不同的URL。请帮我解决一下这个。

最佳答案

仅使用sed这样的事情怎么样:

$ cat file1
<URLS xmlns:"http://www.example.com">
<Service>
<forwardUrl>
<value>http://www.example1.com:80</value>
<value>http://www.example2.com:80</value>
<value>http://www.example3.com:80</value>
<value>http://www.example4.com:80</value>
</forwardUrl>
</Service>
</URLS>
$ declare -a array=($(sed -n '/\s*<forwardUrl>/,/<\/forwardUrl>/p' file1 | sed -e 's/<[^>]*>//g' -e '/^\s*$/d' -e 's/\s*//g'))
$ echo "${array[0]}"
http://www.example1.com:80
$ echo "${array[1]}"
http://www.example2.com:80
$ echo "${array[2]}"
http://www.example3.com:80
$ echo "${array[3]}"
http://www.example4.com:80
$ echo "${array[@]}"
http://www.example1.com:80 http://www.example2.com:80 http://www.example3.com:80 http://www.example4.com:80
$


表达式细目:

declare -a array=($(sed -n '/\s*<forwardUrl>/,/<\/forwardUrl>/p' file1 | sed -e 's/<[^>]*>//g' -e '/^\s*$/d' -e 's/\s*//g'))



sed -n '/\s*<forwardUrl>/,/<\/forwardUrl>/p' file1在与 <forwardUrl>匹配的行之间以及在 </forwardUrl>处(包括两端)打印行
sed -e 's/<[^>]*>//g' -e '/^\s*$/d' -e 's/\s*//g'第一个表达式删除所有标签,第二个表达式删除所有空行(具有空格),最后一个表达式仅删除所有空格


编辑1:

$ cat file1
<URLS xmlns:"http://www.example.com">
<Service>
<forwardUrl>
<value>http://www.sun.com:80</value>
<value>http://www.example2.com:80</value>
<value>http://www.example3.com:80</value>
<value>http://www.example4.com:80</value>
</forwardUrl>
</Service>
</URLS>
$ declare -a array=($(sed -n '/\s*<forwardUrl>/,/<\/forwardUrl>/p' file1 | sed -e 's/<[^>]*>//g' -e '/^\s*$/d' -e 's/\s*//g'))
$ echo "${array[0]}"
http://www.sun.com:80
$ echo "${array[@]}"
http://www.sun.com:80 http://www.example2.com:80 http://www.example3.com:80 http://www.example4.com:80
$

关于xml - 使用Shell脚本从xml获取元素并将其存储在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35877593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com