Bash将XML解析为逗号分隔的列表

时间:2019-12-07 21:03:35

标签: xml bash csv xpath

如何返回以逗号分隔的ID列表?

SELECT Products.ProductID 
FROM Products
INNER JOIN Orders ON Products.ProductID = Orders.ProductId
WHERE Orders.OrderDate < DATEADD(day, -90, GETDATE())
GROUP BY Products.ProductID

预期输出

<nodes>
 <node>
   <id>1</id>
   <name>idbread</name>
 </node>
 <node>
   <id>2</id>
   <name>idbutter</name>
 </node>
</nodes> 

我尝试使用XPath,但是concat仅返回第一个值。

  

xpath node.xml“ // nodes / node / id / text()” 2> / dev / null

返回

1,2

2 个答案:

答案 0 :(得分:4)

您可以为此使用

xmlstarlet sel -t -v "/nodes/node[1]/id" -m "/nodes/node[position()>1]" -v "concat(',',id)" input.xml

这将输出第一个node/id节点的值,然后输出以下用逗号分隔的node/id。输出是所需的。

  • sel选项选择xmlstarlet的选择/查询模式
  • -t表示“ XSLT模板”的开始
  • 第一个-v选项输出XPath表达式的值
  • -m选项在XPath表达式上创建一个for-each
  • 第二个-v选项输出相对于for-each的上下文值的XPath表达式的值

答案 1 :(得分:1)

使用xidel支持xpath 3.0的更简单选项:

xidel -s node.xml -e "string-join(//nodes/node/id/text(),',')"