我有一个具有这种结构的XML
文档:
<root>
<parent id="idvalue1" attr1="val1" attr2="val2" ...>
<child attr3="val3" attr4="val4" ... />
<child attr3="val5" attr4="val6" ... />
...
</parent>
<parent id="idvalue2" attr1="val7" attr2="val8" ... />
...
</root>
我想获取具有它的所有节点的id
属性的所有值的列表。现在,可以安全地假设只有二级元素具有id
属性。
无论如何,最好的方法是什么?是xmllint
,xpath
还是xmlstarlet
?
您可以使用 xmlstarlet 输出列表:
xmlstarlet sel -t -v "//@id" yourfile.xml
但是,这将仅输出 ID 值。
-t 选项"创建"一个 XSLT,就像 Abel 的答案中所建议的那样。但输出将仅是您使用 sel
命令选择的内容。选项 -v 用于在引号中打印 xpath 的值。xpath 表达式中的双斜杠调用所有节点。
我想获取具有它的所有节点的 id 属性的所有值的列表。
使用 XPath,可以使用如下所示的表达式:
//@id
我认为这很容易。如果需要一些布局,可以使用 XSLT:
<xsl:template match="/">
<xsl:apply-templates select="//@*" />
</xsl:template>
<xsl:template match="@id">
<xsl:text>Id is: </xsl:text>
<xsl:value-of select="." />
<xsl:text>
</xsl:text>
</xsl:text>
这将为您提供一个换行符分隔的列表,其中包含名称为 id
的所有属性。