繁体   English   中英

我们如何将XML文件转换为CSV?

[英]How can we convert XML file to CSV?

我有一个XML文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<Results>
    <Row>
        <COL1></COL1>
        <COL2>25.00</COL2>
        <COL3>2009-07-06 15:49:34.984</COL3>
        <COL4>00001720</COL4>
    </Row>
    <Row>
        <COL1>RJ</COL1>
        <COL2>26.00</COL2>
        <COL3>2009-07-06 16:04:16.156</COL3>
        <COL4>00001729</COL4>
    </Row>
    <Row>
        <COL1>SD</COL1>
        <COL2>28.00</COL2>
        <COL3>2009-07-06 16:05:04.375</COL3>
        <COL4>00001721</COL4>
    </Row>  
</Results>

我必须将此XML转换为CSV文件。 我听说我们可以使用XSLT进行此类操作。 如何在Java中(带有/不带有XSLT)执行此操作?

使用XSLT通常不是一个好主意。 使用Apache Commons Digester 它相当容易使用-这是一个粗略的想法:

Digester digester = new Digester();

digester.addObjectCreate("Results/Row", MyRowHolder.class);
digester.addCallMethod("Results/Row/COL1","addCol", 0);
// Similarly for COL2, etc.
digester.parse("mydata.xml");

这将创建MyRowHolder实例(这是您提供的类)。 此类将具有addCol()方法,该方法将为每个带有该标签内容的<COLn>调用。

用伪代码:

loop through the rows:
    loop through all children of `Row`:
        write out the text
        append a comma
    new line

这个快速的小循环将在每行的结尾处写一个逗号,但是我相信您可以弄清楚如何删除它。

为了实际解析XML,我建议使用JDOM 它具有非常直观的API。

在XSLT 1.0中:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text" encoding="ISO-8859-1" />

  <xsl:template match="/Results">
    <xsl:apply-templates select="Row" />  
  </xsl:template>

  <xsl:template match="Row">
    <xsl:apply-templates select="*" />  
    <xsl:if test="not(last())">
      <xsl:value-of select="'&#10;'" />  
    </xsl:if>
  </xsl:template>

  <xsl:template match="Row/*">
    <xsl:value-of select="." />
    <xsl:if test="not(last())">
      <xsl:value-of select="','" />  
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

如果您的COL *值可以包含逗号,则可以将这些值用双引号引起来:

  <xsl:template match="Row/*">
    <xsl:value-of select="concat('"', ., '"')" />
    <!-- ... --->

如果它们可以包含逗号双引号,则由于必需的转义,事情可能会变得更加复杂。 您知道自己的数据,就可以决定如何最好地格式化输出。 也可以选择使用其他分隔符(例如TAB或管道符号)。

使用XSLT,您可以将JAXP接口用于XSLT处理器,然后在样式表中使用<xsl:text>转换为文本输出。

<xsl:text>&#10;</xsl:text>

生成换行符。 例如。

读入XML文件。

遍历每条记录并将其添加到csv文件。

通过标准Java JAXP软件包使用直接的SAX API。 这将允许您编写一个类,该类接收读者遇到的每个XML元素的事件。

简要地:

  1. 使用SAX读取XML
  2. 通过SAX DefaultHandler character()方法记录文本值
  3. 当您收到COL的结束事件时,请记录此字符串值
  4. 当您收到ROW结束事件时,只需用逗号分隔之前记录的值的行即可

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM