使用unix终端解析XML

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>&#xA;</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结果生成为标准输出.


Pet*_*ton 9

使用命令行XSLT处理器(如xsltproc,saxonxalan)来解析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>&#10;</xsl:text>
    </xsl:template> 
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您只想要任何元素的名称属性,这里有一个快速但不完整的解决方案.

(您的示例文本位于文件示例中)

grep"name"示例| cut -d"\"" - f2,2 | xargs -I {} echo"{},"


Dav*_*veP 6

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