使用JAVA计算,转换和编译XML到CSV

时间:2011-12-17 16:30:51

标签: java xml sax saxparser

我需要将多个XML文件(以标准格式)转换并编译为单个CSV文件。因为我还需要对某些导入的元素执行计算,所以XSLT不是一个选项(Stackoverflow:XML to CSV Using XSLT),除非我对每个转换后的CSV文件执行计算。

XPath已被建议作为SAX2的替代品,但由于最终的CSV输出很大(基于100多个XML文件),我对使用数组犹豫不决。 (Stackoverflow:Convert XML file to CSV

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

1 个答案:

答案 0 :(得分:0)

我建议使用JDOM将XML读入内存。然后,您可以使用常规Java语法以编程方式轻松访问它。之后,您可以使用任何库轻松创建CSV文件。我个人使用opencsv

如果您担心的是内存使用情况,最重要的是尽可能在内存中保留尽可能少的XML文件。如果您逐个阅读文件,然后只在其他数据结构中存储您需要的信息,那么您应该没问题。例如,您可以创建一个由ID键控的起始值的Map和一个由ID键控的停止值的Map。