3

在 shell 脚本中,我有一个 xml 文件作为 p.xml,如下所示,我想解析它并获取两个数组中的值。我正在尝试使用 xmllint,但无法获得所需的数据。

    <?xml version="1.0" encoding="UTF-8"?>
    <Share_Collection>
      <Share id="data/Backup" resource-id="data/Backup" resource-type="SimpleShare" share-name="Backup" protocols="cifs,afp"/>
      <Share id="data/Documents" resource-id="data/Documents" resource-type="SimpleShare" share-name="Documents" protocols="cifs,afp"/>
      <Share id="data/Music" resource-id="data/Music" resource-type="SimpleShare" share-name="Music" protocols="cifs,afp"/>
      <Share id="data/OwnCloud" resource-id="data/OwnCloud" resource-type="SimpleShare" share-name="OwnCloud" protocols="cifs,afp"/>
      <Share id="data/Pictures" resource-id="data/Pictures" resource-type="SimpleShare" share-name="Pictures" protocols="cifs,afp"/>
      <Share id="data/Videos" resource-id="data/Videos" resource-type="SimpleShare" share-name="Videos" protocols="cifs,afp"/>
    </Share_Collection>

我想获得一个包含所有共享 ID 的数组和一个包含共享名称的数组。所以两个数组就像

share-ids-array = ["data/Backup", "data/Documents", "data/Music", "data/OwnCloud", "data/Pictures", "data/Videos"]     

share-names-array = ["Backup", "Documents", "Music", "OwnCloud", "Pictures", "Videos"]

我开始如下:

xmllint --xpath '//Share/@id' p.xml 
xmllint --xpath '//Share/@share-name' p.xml 

这给了我

id="data/Backup" 
id="data/Documents" id="data/Music" id="data/OwnCloud" id="data/Pictures" id="data/Videos" 

任何帮助建立这两个阵列将不胜感激。

4

1 回答 1

6

这是 grep (和 tr)的一种解决方案...sed 或 awk 是其他选择。顺便说一句,你不能在 bash 的变量名中使用连字符。

share_ids=($( xmllint --xpath '//Share/@id' p.xml | grep -Po '".*?"' | tr -d \" ))
share_names=($( xmllint --xpath '//Share/@share-name' p.xml | grep -Po '".*?"' | tr -d \" ))

例子:

$ echo ${share_names[@]}
Backup Documents Music OwnCloud Pictures Videos

不过,使用xmlstarlet可能会更好:

share_names=($( xmlstarlet sel -T -t -m '//Share/@share-name' -v '.' -n p.xml ))
于 2014-01-28T00:16:12.420 回答