8

我想使用 xmllint 中的 xpath 来获取主机名和序列号。

这是XML

<hosts>
 <host name="blah001" serial="ABC001">
  <moreinfo />
 </host>
 <host name="blah002" serial="ABC002">
  <moreinfo />
 </host>
 ..
</hosts>

我可以获取主机名 blah* 的所有连续剧:

/ > cat //hosts/host[starts-with(@name,"blah")]/@serial
 -------
 serial="ABC001"
 -------
 serial="ABC002"

但我也想看看哪个主机名有那个序列号。那可能吗?

4

2 回答 2

7

这可以通过以下 XPath 表达式在 xmllint 中完成。假设您的 XML 名为 hosts.xml。

xmllint hosts.xml --xpath '//host[starts-with(@name,"blah")]/@name | //host[starts-with(@name,"blah")]/@serial' | xargs -n2

这是因为 | XPath 表达式中的运算符可以支持多个路径。

于 2018-03-22T08:35:42.360 回答
3

host也许只需选择元素的所有属性就足够了?

$ xmllint example.xml --xpath "//hosts/host[starts-with(@name,"blah")]/@*" > out.txt
$ cat out.txt
  name="blah001" serial="ABC001" name="blah002" serial="ABC002"

如果这还不够——如果输出应该以某种方式结构化,我建议您编写一个简单的 XSLT 转换或使用 XQuery。

编辑

所以我会听从你的建议并使用 xslt 或 xquery

很好,如果您决定使用 XSLT,您需要的样式表将类似于:

XSLT 样式表 (1.0)

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" encoding="UTF-8" />

    <xsl:template match="host[starts-with(@name,'blah')]">
        <xsl:value-of select="concat('HOST: ',@name, ' SERIAL: ', @serial)"/>
    </xsl:template>
</xsl:transform>

输出

 HOST: blah001 SERIAL: ABC001
 HOST: blah002 SERIAL: ABC002
于 2015-02-12T15:31:21.133 回答