[英]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="' '" />
</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> </xsl:text>
生成換行符。 例如。
讀入XML文件。
遍歷每條記錄並將其添加到csv文件。
通過標准Java JAXP軟件包使用直接的SAX API。 這將允許您編寫一個類,該類接收讀者遇到的每個XML元素的事件。
簡要地:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.