【问题标题】:xmlstarlet: how to select items to build a hashxmlstarlet:如何选择项目来构建哈希
【发布时间】:2013-09-09 21:58:03
【问题描述】:

我想从以下 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>

给定namereadableName 的值。在上面的示例中,这将是 Scan1,用于查询 b486f8d9

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

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

但这不起作用(空输出)

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

谢谢!

【问题讨论】:

    标签: xml bash hash xml-parsing xmlstarlet


    【解决方案1】:

    比较:

    name=b486f8d9
    

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

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

    但这会让你得到一大块 XML(因为它是所选元素的 -*c*opy)。你想要的是字符串 -*v*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
    

    【讨论】:

    • 完美 - 谢谢。我将看到如何最好地将它集成到哈希中(但我想迭代将是要走的路)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2019-03-28
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多