使用 xmllint 获取多个值
Fetching multiple values using xmllint
我想使用 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"
但我也想看看哪个主机名有那个序列号。这可能吗?
也许只 select 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。
编辑
so I will follow your suggestion and use xslt or 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
这可以在 xmllint 中使用以下 XPath 表达式完成。
假设您的 XML 被命名为 hosts.xml.
xmllint hosts.xml --xpath '//host[starts-with(@name,"blah")]/@name | //host[starts-with(@name,"blah")]/@serial' | xargs -n2
这是因为| XPath 表达式中的运算符可以支持多个路径。
我想使用 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"
但我也想看看哪个主机名有那个序列号。这可能吗?
也许只 select 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。
编辑
so I will follow your suggestion and use xslt or 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
这可以在 xmllint 中使用以下 XPath 表达式完成。 假设您的 XML 被命名为 hosts.xml.
xmllint hosts.xml --xpath '//host[starts-with(@name,"blah")]/@name | //host[starts-with(@name,"blah")]/@serial' | xargs -n2
这是因为| XPath 表达式中的运算符可以支持多个路径。