Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将XML文件转换为CSV?_Java_Xml_Csv - Fatal编程技术网

Java 如何将XML文件转换为CSV?

Java 如何将XML文件转换为CSV?,java,xml,csv,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

我有一个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>

25
2009-07-06 15:49:34.984
00001720
RJ
26
2009-07-06 16:04:16.156
00001729
SD
28
2009-07-06 16:05:04.375
00001721

我必须将这个XML转换成CSV文件。我听说我们可以使用XSLT做这样的事情。我如何在Java中做到这一点(使用/不使用XSLT)

使用XSLT,您可以使用JAXP接口连接到XSLT处理器,然后在样式表中使用转换为文本输出

<xsl:text>&#10;</xsl:text>
生成换行符。例如。

在中读取XML文件

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

在伪代码中:

loop through the rows:
    loop through all children of `Row`:
        write out the text
        append a comma
    new line
这个快速的小循环会在每一行的末尾写一个逗号,但我相信你能想出如何删除它

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

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

简而言之:

  • 使用SAX在中读取XML
  • 通过SAX characters()方法记录文本值
  • 当获得列的结束事件时,记录此字符串值
  • 当您得到行结束事件时,只需写出一行以逗号分隔的先前记录的值

  • 使用XSLT通常是个坏主意。使用。它相当容易使用-这里有一个粗略的想法:

    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()
    方法,该方法将为每个
    调用该标记的内容。

    在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('"', ., '"')" />
        <!-- ... --->
    
    
    

    如果它们可以包含逗号和双引号,那么由于需要转义,事情可能会变得更加复杂。您知道您的数据,您将能够决定如何最好地格式化输出。使用不同的分隔符(例如选项卡或管道符号)也是一种选择。

    同意。在这种情况下使用XSLT是过分的。不需要学习一种新的语言就可以从这么简单的格式输出CSV。我们将如何做到这一点DerekI不认为如果您不熟悉可用的XML API,这会非常有用:-(您忘记了转义(如果数据中有逗号怎么办?)@Brian:如果可能的话,请给出一个例子。我会看一下链接的教程,并实现一个简单的DefaultHandler。当你运行它时,你会看到(在调试器中,或通过打印输出)事件方法是如何调用的,这应该会让事情变得更清楚。对不起,我不能简单地发布一个“使用XSLT通常是个坏主意”的示例。我可以问一下为什么吗?:)此外,海报还询问如何在没有XSLT的情况下用Java实现这一点。所以我不知道我为什么会被否决:-(消化池未充分利用。+1this@VinaySajip:同意,XSLT的调试有点困难。但是,将上述内容转换为CSV非常简单,因此所需的XSLT可能不需要太多调试。@Vinay Sajip:另外,问题是是否使用XSLT,通常似乎更支持XSLT。;-)我认为问题在于理解如何解析XML,而不是编写结果值。你忘记了转义(如果数据中有逗号怎么办?)。附言:我将把它作为一个练习留给读者,让他们找到显示如何在Java中使用XSLT的示例。这并不难。:)