2011-12-17 32 views
0

我需要將多個XML文件(以標準格式)轉換和編譯爲單個CSV文件。因爲我還需要對某些導入的元素執行計算,所以除非我對每個轉換的CSV文件執行計算,否則XSLT不是一個選項(Stackoverflow:XML to CSV Using XSLT)。使用JAVA計算,轉換和編譯XML到CSV

XPath已被建議作爲SAX2的替代品,但由於最終的CSV輸出很大(基於超過100個XML文件),我對使用數組猶豫不決。 (使用SAX2)我在提取標記元素方面有些成功。

如果我可以將輸出(對於每個單獨的文件)追加到最終的CSV輸出,我假設我將擁有更多內存穩定的應用程序。

我希望其他人能從瞭解問題的答案中獲益:我如何有效地處理與大規模數據的XML-CSV轉換相關的計算?

XML文件1

<element id="1"> 
    <info>Yes</info> 
    <startValue>0</startValue> <!-- Value entered twice, ignore--!> 
    <startValue>256</startValue> 
    <stopValue>64</stopValue> 
</element> 
<element id="2"> 
    <info>No</info> 
    <startValue>50</startValue> 
    <stopValue>25</stopValue> 
</element> 
<.... 

XML文件2

<element id="1"> 
    <info>No</info> 
    <startValue>128</startValue> 
    <stopValue>100</stopValue> 
</element>  
<.... 

Pseudopseudocode

for all files 

    get ID 
    get info 

    for all stop and start values 
     ignore wrong values: use counter 
     difference[] = startValue(i) - stopValues(j) = 196, 28 

    append (ID, info and difference) to file "outputfile.csv" 

CSV Eutput例

File ID Info Difference Etc 
_________________________________________________ 
0  1 Yes  196   .... 
0  2 No  25   .... 
1  1 No  28   .... 
.   ...  ...   .... 
.   ...  ...   .... 
nfiles 

回答

0

我建議使用JDOM讀取XML到內存中。然後,您可以使用常規Java語法以編程方式輕鬆訪問它。之後,您可以使用任何庫輕鬆創建CSV文件。我個人使用opencsv

如果您關心的是內存使用情況,最重要的是儘可能少地將內存中的XML文件保留在內存中。如果您逐一讀取這些文件,然後在其他數據結構中只存儲您需要的信息,則應該沒問題。例如,您可以創建一個以ID爲鍵的起始值地圖和由ID鍵入的停止值地圖。

+0

Thanks user393274! – noumenal 2011-12-17 17:28:14