【问题标题】:How can we convert XML file to CSV using Java Code?我们如何使用 Java 代码将 XML 文件转换为 CSV?
【发布时间】:2017-08-22 09:30:16
【问题描述】:

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

这是我想要的 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

【问题讨论】:

  • 我认为你需要考虑如何从这个 xml 构造你的 csv 文件。
  • 您能否向我们提供预期的 CSV 输出?
  • @khriskooper 和 @Stefan 我已经展示了我的 CSV 输出。
  • 您是否考虑过使用 xpath 来更轻松地读取 XML 值? XML 文件中的组件顺序是否正确?
  • @khriskooper 组件在 XML 文件中的顺序是否正确?是的

标签: java xml csv


【解决方案1】:

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

    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 数据的结构一致。

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

【讨论】:

  • 这真的很有帮助。谢谢。
  • 很高兴这对您有所帮助。请考虑接受我的回答,以防它帮助其他人。祝你好运!
  • 这太可怕了。只需用 JDOM 2 或其他东西解析它。这种尽可能可能失败的意愿不值得传播。
  • @kumesana,我同意如果可能的话,最好使用经过时间测试的解析库。如果数据足够一致,我看不出这种方法有什么问题。
  • @khriskooper 首先期望这种数据一致性是错误的。当您创作 XML 文档时,您知道标记不必尊重这种缩进,因此您不会开始关心。也许它会保持一致,也许它不会,这不是任何人的问题。在处理 XML 时,如果您开始期待这些事情,那么您就失败了。它也无法处理诸如字符转义和 CDATA 部分之类的东西,它们是完全可以接受的 XML,没有理由被拒绝,因此不要放在那里。
猜你喜欢
  • 1970-01-01
  • 2014-02-20
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
相关资源
最近更新 更多