0

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

<?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给定的值name。在上面的示例中,这将Scan1用于查询b486f8d9.

在一个非常相似的问题上找到了一个很好的答案,但是查询是在另一种类型的元素上,然后尝试了

xmlstarlet sel -t -c "/reports/report[name=b486f8d9]" list.xml

但这不起作用(空输出)

您能帮我为我的案例构建适当的查询吗?因为我最终想在 bash 中构建一个哈希(键name和值readableNametimestamp)也许有一种更聪明的方法来做到这一点,而不是按照我打算的方式解析文件(=首先获取names 的列表,然后查询他们每个人的价值)?

谢谢!

4

1 回答 1

1

比较:

name=b486f8d9

将标签name的值与元素的值进行比较b486f8d9。由于没有 element b486f8d9,那是行不通的。您想要的是将元素name与字符串进行比较'b486f8d9'

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

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

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
于 2013-09-09T13:58:03.627 回答