首页 > 解决方案 > Bash 将 XML 解析为逗号分隔的列表

问题描述

请问如何返回以逗号分隔的 id 列表?

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

预期产出

1,2

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

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

返回

12

标签: xmlbashcsvxpath

解决方案


您可以为此使用

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

这会输出第一个node/id节点的值,然后输出node/id以逗号分隔的以下 s。输出如所愿。

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

推荐阅读