我想从以下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>
给定name
的readableName
值。在上面的示例中,这将Scan1
用于对b486f8d9
的查询。
我在一个非常相似的问题上找到了一个很好的答案,但查询是在另一种类型的元素上,然后尝试了
xmlstarlet sel -t -c "/reports/report[name=b486f8d9]" list.xml
但这不起作用(空输出)
你能帮我为我的案例构建适当的查询吗?由于我最终想在 bash 中构建一个哈希(键是 name
和值readableName
和 timestamp
),也许有一种更聪明的方法可以做到这一点,而不是按照我想要的方式解析文件(= 首先获取 name
s 的列表,然后查询每个值)?
谢谢!
比较:
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