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

时间:2009-07-06 12:54:41

标签: java xml 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)中做到这一点?

6 个答案:

答案 0 :(得分:5)

使用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>调用。

答案 1 :(得分:4)

在伪代码中:

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

快速的小循环会在每行的末尾写一个逗号,但我相信你可以弄清楚如何删除它。

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

答案 2 :(得分:3)

在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或管道符号)也是一种选择。

答案 3 :(得分:1)

使用XSLT,您可以使用JAXP接口连接到XSLT处理器,然后使用&lt; xsl:text&gt;在样式表中转换为文本输出。

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

生成换行符。例如。

答案 4 :(得分:1)

阅读。

中的XML文件

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

答案 5 :(得分:1)

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

简言之:

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