簡體   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