如何通过xmllint将XML转换为每行对应单个item的汇总CSV文件?
问题:用xmllint直接将XML转换为每行对应item的CSV格式
原始XML内容
<items> <item> <id>abc123</id> <name>widget</name> <quantity>1.0</quantity> </item> <item> <id>def456</id> <name>sprocket</name> <quantity>6.0</quantity> </item> <item> <id>ghi789</id> <name>gear</name> <quantity>11.0</quantity> </item> </items>
期望的CSV输出
abc123,widget,1.0 def456,sprocket,6.0 ghi789,gear,11.0
尝试的命令及问题
执行以下xmllint命令:
xmllint --xpath '//item/id/text()|//item/name/text()|//item/quantity/text()' input.xml
输出结果为每个字段单独一行,无法直接得到每行对应一个item的CSV格式:
abc123 widget 1.0 def456 sprocket 6.0 ghi789 gear 11.0
解决方案
可以直接通过xmllint实现需求,无需额外脚本处理,使用以下命令:
xmllint --noent --xpath '//item/concat(id/text(), ",", name/text(), ",", quantity/text(), " ")' input.xml
命令说明:
--noent:启用XML实体解析,将表达式中的 转换为实际的换行符- XPath表达式
//item/concat(...):遍历每个<item>节点,将其下的id、name、quantity文本值用逗号拼接,最后添加换行符,确保每个item的内容单独占一行
如果字段中包含逗号、引号等特殊字符,这个基础方法无法处理转义,但针对当前需求的场景可以完美输出目标CSV格式。
内容的提问来源于stack exchange,提问作者Joshua Davies
相关产品推荐
相关产品推荐

