【问题标题】:Bash Parse XML to comma separated listBash 将 XML 解析为逗号分隔的列表
【发布时间】:2019-12-07 21:03:35
【问题描述】:

请问如何返回以逗号分隔的 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

【问题讨论】:

  • xpath 二进制/脚本从何而来?唯一一个我found 没有你使用的语法。
  • @fredrik:OP 可能正在做类似xmllint --xpath "//nodes/node/id/text()" node.xml 的事情,但在我的系统上它返回12。版本:xmllint: using libxml version 20904
  • @ArkadiuszDrabczyk 当他在问题中说明他正在运行哪个命令时,您是如何得出这个结论的?
  • @mri.o 你可以使用echo $(sed -n 's:&lt;id&gt;\(.*\)&lt;/id&gt;:\1, :pg' file)
  • @sergio: Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器(xmlstarlet、xmllint ...)。

标签: xml bash csv xpath


【解决方案1】:

您可以为此使用

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

这会输出第一个node/id 节点的值,然后输出后面的node/ids,用逗号分隔。输出如你所愿。

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

【讨论】:

    【解决方案2】:

    一个更简单的选项,使用支持 xpath 3.0 的 xidel

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

    【讨论】:

    • 接受这个,因为它看起来更干净
    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2013-09-01
    相关资源
    最近更新 更多