从XML获取所有属性值

时间:2017-03-03 18:12:00

标签: xml xmllint

我有以下XML示例文件。

<root>
<ul id="nav">
    <li id="id1">some</li>
    <li id="id2"> unimportant
        </li>
    <li id="id3"> text.
        </li>
</ul>

<ul id="tag">
    <li id="id1">SOME</li>
    <li id="id2"> MORE
        </li>
    <li id="id3"> TEXT.
        </li>
</ul>
</root>

我想使用xmllint提取<li>下列出的所有<ul id="nav">元素的所有属性值。

我可以用

xmllint --xpath '//ul[@id="nav"]/li/@id' sample.xml

将返回

id="id1" id="id2" id="id3"

但是,我想得到

id1 id2 id3

我试过

xmllint --xpath 'string(//ul[@id="nav"]/li/@id)' sample.xml

但这只返回第一个属性的值

id1

我可以在不使用awk,sed等其他工具的情况下提取所有值吗?它们可能由空格或换行符分隔,在我的情况下并不重要。

1 个答案:

答案 0 :(得分:1)

如果您可以使用xmlstarlet,则可以使用-v--value-of)命令行选项:

xmlstarlet sel -t -v "//ul[@id='nav']/li/@id" sample.xml

我认为你不能使用HTML作为sel命令的输入,但我可能错了。

我知道您可以使用tr(翻译)命令(使用--html)。然后你可以使用XSLT ......

xmlstarlet tr --html sample.xsl sample.xml

XSLT (sample.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:for-each select="//ul[@id='nav']/li/@id">
      <xsl:value-of select="concat(.,'&#xA;')"/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>