从 XML 获取所有属性值
Get all attribute values from XML
我有以下 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
来提取 <ul id="nav">
.
下列出的所有 <li>
元素的所有属性值
我可以用
xmllint --xpath '//ul[@id="nav"]/li/@id' sample.xml
这将 return
id="id1" id="id2" id="id3"
不过,我想得到
id1 id2 id3
我试过了
xmllint --xpath 'string(//ul[@id="nav"]/li/@id)' sample.xml
但这只是return第一个属性的值
id1
我可以在不求助于 awk、sed 等其他工具的情况下提取所有值吗?它们可能由 space 或换行符分隔,这对我来说并不重要。
如果可以使用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(.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我有以下 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
来提取 <ul id="nav">
.
<li>
元素的所有属性值
我可以用
xmllint --xpath '//ul[@id="nav"]/li/@id' sample.xml
这将 return
id="id1" id="id2" id="id3"
不过,我想得到
id1 id2 id3
我试过了
xmllint --xpath 'string(//ul[@id="nav"]/li/@id)' sample.xml
但这只是return第一个属性的值
id1
我可以在不求助于 awk、sed 等其他工具的情况下提取所有值吗?它们可能由 space 或换行符分隔,这对我来说并不重要。
如果可以使用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(.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>