0

使用 xmlstarlet 提取和转储元素

在这篇文章中,我发现了如何按内容选择元素。完美运行!

但不是每个值:-(

这是我的xml:

<metainfo id="19120454-8234-47EB-B7FE-7691B53788DF" type="volume">
                <id>
                        3138224245
                </id>
                <index>
                        1
                </index>
                <is-last>
                        1
                </is-last>
                <name>
                        asdf
                </name>
                <raw-archive-id>
                        6898476220317415805
                </raw-archive-id>
                <raw-archive-key>
                        977D7B4B-D234-4E95-8BE2-BE0F8E865701
                </raw-archive-key>
                <size>
                        54812566016
                </size>
                <slice-key/>
                <timestamp>
                        1385742689568
                </timestamp>
        </metainfo>

通过 id、索引或时间戳进行选择非常有效。(“xml”是windows版本中的命令...):

xml sel -t -c "/metabundle/metainfo[timestamp=1385742689568]" test.xml

但是如果我想通过另一个标签进行选择,例如“name”或“raw-archive-key”,就会出现问题:

xml sel -t -c "/metabundle/metainfo[name=asdf]" test.xml

此命令不会产生任何输出。在名称和原始存档密钥这两个标签中,都有字母数字字符。如果我将“asdf”更改为“01”,它会起作用!

那么如果它包含字母数字字符,如何按内容选择呢?

提前致谢!

4

1 回答 1

2

您需要引用字符串值,否则它会查找带有 name 的标签asdf。此外,您必须使用normalize-space()忽略前导和尾随空格:

xml sel -t -c "/metabundle/metainfo[normalize-space(name)='asdf']" test.xml
于 2014-02-06T15:22:15.920 回答