Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java代码将XML文件转换为CSV?_Java_Xml_Csv - Fatal编程技术网

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

如何使用Java代码将XML文件转换为CSV?,java,xml,csv,Java,Xml,Csv,我想使用Java代码将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.

我想使用Java代码将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>

您可以逐行读取文件,只提取所需的数据,并将所有内容存储到字符串的临时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);
    }
读取后,可以将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数据始终保持这样的一致结构


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

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

    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);
    }
读取后,可以将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数据始终保持这样的一致结构



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

我认为您需要考虑如何使用此xml构造csv文件。您能为我们提供预期的csv输出吗?@khriskooper和@Stefan我已经展示了我的csv输出。您是否想过使用xpath使读取xml值更容易?组件在XML文件中的顺序是否正确?@khriskooper组件在XML文件中的顺序是否正确?是的,我认为您需要考虑如何使用此xml构建您的csv文件。您能为我们提供预期的csv输出吗?@khriskooper和@Stefan我已经展示了我的csv输出。您是否考虑过使用xpath使读取xml值更容易?组件在XML文件中的顺序是否正确?@khriskooper组件在XML文件中的顺序是否正确?是的,这真的很有帮助。谢谢。我很高兴这对你有帮助。请考虑接受我的回答,以防其他人的帮助。祝你好运这太可怕了。只需要用JDOM2或其他东西来解析它。这种尽可能失败的意愿不值得推广。@kumesana,我同意如果可能的话,最好使用经过时间测试的解析库。如果数据足够一致,我看不出这种方法有什么错。@khriskooper首先期望这种数据一致性是错误的。当您编写XML文档时,您知道标记不必尊重这种缩进,因此您不会开始在意。也许这会是一致的,也许不会,这不是谁的问题。在处理XML时,如果您开始期待这些事情,那么您就会失败。它也无法处理诸如字符转义和CDATA节之类的内容,这些内容是完全可以接受的XML,没有理由被拒绝,因此没有放在那里。它真的很有帮助。谢谢。我很高兴这对你有帮助。请考虑接受我的回答,以防其他人的帮助。祝你好运这太可怕了。只需要用JDOM2或其他东西来解析它。这种尽可能失败的意愿不值得推广。@kumesana,我同意如果可能的话,最好使用经过时间测试的解析库。如果数据足够一致,我看不出这种方法有什么错。@khriskooper首先期望这种数据一致性是错误的。当您编写XML文档时,您知道标记不必尊重这种缩进,因此您不会开始在意。也许这会是一致的,也许不会,这不是谁的问题。在处理XML时,如果您开始期待这些事情,那么您就会失败。它也无法处理诸如字符转义和CDATA节之类的内容,这些内容是完全可以接受的XML,没有理由被拒绝,因此没有放在那里。