如何使用Java代码将XML文件转换为CSV?

时间:2017-08-22 09:30:16

标签: java xml csv

我想使用Java Code将XML文件转换为CSV,我不想使用XML样式表(XSL)或XSLT。这是我的XML文件。

<?xml version="1.0" encoding="UTF-8"?>
<PickAndPlace>
<Components>
    <Component id="1">
        <X_Dimension>4.33</X_Dimension>
        <Y_Dimension>2.962</Y_Dimension>
        <Designation>None</Designation>
        <Package>None</Package>
        <Angle>0</Angle>
    </Component>
    <Component id="5">
        <X_Dimension>4.33</X_Dimension>
        <Y_Dimension>8.692</Y_Dimension>
        <Designation>None</Designation>
        <Package>None</Package>
        <Angle>0</Angle>
    </Component>
    <Component id="9">
        <X_Dimension>4.33</X_Dimension>
        <Y_Dimension>14.381</Y_Dimension>
        <Designation>None</Designation>
        <Package>None</Package>
        <Angle>0</Angle>
    </Component>
</Components>
</PickAndPlace>

这就是我想要的CSV输出。

X_Dimension,Y_Dimension,Designation,Package,Angle,_id
4.33,2.962,None,None,0,1
4.33,8.692,None,None,0,5
4.33,14.381,None,None,0,9

1 个答案:

答案 0 :(得分:2)

您可以逐行读取文件,仅提取所需的数据,并将所有内容存储到字符串的临时LinkedList中:

    LinkedList<String> tmpList = new LinkedList<String>();
    try (
        BufferedReader reader = Files.newBufferedReader(Paths.get("c:/tmp.xml"), Charset.forName("UTF-8"))) {
        String line = StringUtils.EMPTY;
        while ((line = reader.readLine()) != null) {
            if(line.contains("<Component id=")) {
                String _id = extractValue(line, "<Component id=\"", "\">");
                String _xDimension = extractValue(reader.readLine(), "<X_Dimension>", "</X_Dimension>");
                String _yDimension = extractValue(reader.readLine(), "<Y_Dimension>", "</Y_Dimension>");
                String _designation = extractValue(reader.readLine(), "<Designation>", "</Designation>");
                String _package = extractValue(reader.readLine(), "<Package>", "</Package>");
                String _angle = extractValue(reader.readLine(), "<Angle>", "</Angle>");
                tmpList.add(_xDimension + "," + _yDimension + "," + _designation + "," + _package + "," + _angle + "," + _id);
            }

        }
    } catch (IOException e) {
        System.err.println(e);
    }

这个方便的实用方法将处理提取上述代码的值。请注意,根据您的数据和要求,可能需要使其更加强大,但它适用于您提供的样本集:

private static String extractValue(String line, String prefix, String postfix) {
    String value = line.trim().replaceAll(prefix, "");
    value = value.replaceAll(postfix, "");
    return value;
}

一旦阅读,您可以将字符串的LinkedList写入新文件:

    try{
        PrintWriter writer = new PrintWriter("c:/tmp.csv", "UTF-8");
        writer.println("X_Dimension,Y_Dimension,Designation,Package,Angle,_id");
        for(String line : tmpList) {
            writer.println(line);
        }
        writer.close();
    } catch (IOException e) {
        System.err.println(e);
    }

当然,这种方法在很大程度上依赖于XML数据的整体结构。

作为最后一点,您可以通过直接写入文件来删除对临时列表的需要,而不是先将值添加到列表中。不过在代码中分离输入和输出是很好的。