xmlstarlet:如何选择要构建哈希的项目

时间:2013-09-09 11:23:09

标签: xml bash hash xml-parsing xmlstarlet

我想从以下XML文件(list.xml)中提取(使用xmlstarlet

<?xml version="1.0" encoding="UTF-8"?>
<reports>
  <report>
    <name>b486f8d9</name>
    <readableName>Scan1</readableName>
    <timestamp>1375757990</timestamp>
  </report>
  <report>
    <name>5f01bd96</name>
    <readableName>Scan2</readableName>
    <timestamp>1367342696</timestamp>
  </report>
</reports>

给定readableName的{​​{1}}的值。在上面的示例中,name上的查询为Scan1

我找到a great answer on a very similar problem,但查询是在另一种类型的元素上,然后尝试

b486f8d9

但这不起作用(空输出)

你能帮我为我的案例构建适当的查询吗?因为我最终想要在bash中构建一个哈希值(密钥为xmlstarlet sel -t -c "/reports/report[name=b486f8d9]" list.xml ,值为namereadableName),所以有一种更聪明的方法可以做到这一点,而不是按照方式解析文件我打算(=首先得到timestamp的列表,然后查询每个的值)?

谢谢!

1 个答案:

答案 0 :(得分:1)

比较:

name=b486f8d9

将标记name的值与元素b486f8d9的值进行比较。由于没有元素b486f8d9,因此不起作用。您想要的是将元素name与字符串'b486f8d9'进行比较:

xmlstarlet sel -t -c "/reports/report[name='b486f8d9']"

但是这会让你获得一大块XML(因为它是所选元素的 - * c * opy)。你想要的是readableName元素的字符串 - * v * alue:

xmlstarlet sel -t -v "/reports/report[name='b486f8d9']/readableName"

将打印

Scan1

这就是你如何进行查找。但我相信你想要对所有名字进行全面报道。您可以创建任何您喜欢的格式;这是一个例子(注意使用 - * m * atch来匹配所有/reports/report个元素。)

$ xmlstarlet sel -t -m "/reports/report" \
                 -v name -o ' ' -v readableName -o ':' -v timestamp -n list.xml
b486f8d9 Scan1:1375757990
5f01bd96 Scan2:1367342696