Mat*_*ias 12 xml unix csv shell parsing
有时我需要从XML文件中快速提取一些任意数据以放入CSV格式.在Unix终端中执行此操作的最佳做法是什么?我会喜欢一些代码示例,所以例如如何才能解决以下问题?
示例XML输入:
<root>
<myel name="Foo" />
<myel name="Bar" />
</root>
Run Code Online (Sandbox Code Playgroud)
我想要的CSV输出:
Foo,
Bar,
Run Code Online (Sandbox Code Playgroud)
jel*_*irt 12
彼得的答案是正确的,但它会输出一个尾随换行符.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="root">
<xsl:for-each select="myel">
<xsl:value-of select="@name"/>
<xsl:text>,</xsl:text>
<xsl:if test="not(position() = last())">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
只是运行例如
xsltproc stylesheet.xsl source.xml
Run Code Online (Sandbox Code Playgroud)
将CSV结果生成为标准输出.
使用命令行XSLT处理器(如xsltproc,saxon或xalan)来解析XML并生成CSV.这是一个示例,对于您的情况是样式表:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="root">
<xsl:apply-templates select="myel"/>
</xsl:template>
<xsl:template match="myel">
<xsl:for-each select="@*">
<xsl:value-of select="."/>
<xsl:value-of select="','"/>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您只想要任何元素的名称属性,这里有一个快速但不完整的解决方案.
(您的示例文本位于文件示例中)
grep"name"示例| cut -d"\"" - f2,2 | xargs -I {} echo"{},"
XMLStarlet是一个命令行工具包,用于查询/编辑/检查/转换XML文档(有关更多信息,请参阅http://xmlstar.sourceforge.net/)
没有要写的文件,只需将文件传输到xmlstarlet并应用xpath过滤器.
cat file.xml | xml sel -t -m'xpathExpression'-v'lemName'' literal'-v'elname'-n -m expression -v value''included literal -n newline
所以对于你的xpath,xpath表达式将是// myel/@ name,它将提供两个属性值.
非常方便的工具.
HTH