使用xmlstarlet提取和转储元素

时间:2009-12-11 20:29:50

标签: xml xmlstarlet

我正在寻找一种使用xmlstarlet从我的xml中提取和打印元素的方法;例如,如果我的xml是

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

我想将价格= 29.99的book元素打印出来:

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

我理解选择这样一个元素的xpath查询(/bookstore/book[price=29.99)但是 我无法在stdout上打印/转储它。如果我使用'-v'选项并使用-v(。)我没有得到我想要的输出(包含其中的所有标签)我只是得到文本值。应该有一种简单地将所选元素转储的方法,这就是我要找的东西。

感谢您的期待。

1 个答案:

答案 0 :(得分:18)

使用“-c”(复制)选项,应该实现您的目标:

xmlstarlet sel -t -c "/bookstore/book[price=29.99]" books.xml

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

您可以通过在“sel”之后添加全局“-C”开关来观看xmlstarlet内部生成的XSLT。这显示了复制选项如何产生xslt副本构造:

...
<xsl:template name="t1">
  <xsl:copy-of select="/bookstore/book[price=29.99]"/>
</xsl:template>
...

这会导致包含命名空间节点,子节点和属性节点,参见XSLT规范(see w3schools summary)