Java库或应用程序将CSV转换为XML文件?

Java 中是否有现有的应用程序或库,它允许我将 CSV 数据文件转换为 xml 文件?

通过可能包含列标题的第一行来提供 xml 标记。

0
额外 编辑
意见: 5
看起来这是SO中Java标记的第一个问题。
额外 作者 Paul Vargas,
@ bjb568你是什么意思?
额外 作者 CodingNinja,
@ bjb568哦。哈哈
额外 作者 CodingNinja,
@保罗不仅如此,它也是123!
额外 作者 bjb568,
额外 作者 bjb568,

16 答案

这可能太基本或者只限于某个解决方案,但难道你不能做一个 String.split() ,记住第一行的结果数组以产生XML ,并用每个循环的迭代填充适当的XML元素来吐出每行的数组数据?

0
额外
如果您的CSV文件在数据中包含带引号的逗号,这种情况很常见。
额外 作者 Alan Krueger,

我不明白你为什么想要这样做。这听起来像货物崇拜编码。

将CSV文件转换为XML不会添加任何值。您的程序已在读取CSV文件,因此争辩说您需要XML不起作用。

另一方面,读取CSV文件,使用值来做 something ,然后序列化为XML确实有意义(就像使用XML可能有意义......;)),但是你应该已经有了序列化XML的方法。

0
额外

我知道你问过Java,但这让我觉得这是一个非常适合脚本语言的任务。这是一个用Groovy编写的快速(非常简单)的解决方案。

test.csv </强>

string,float1,float2,integer
hello world,1.0,3.3,4
goodbye world,1e9,-3.3,45
hello again,-1,23.33,456
hello world 3,1.40,34.83,4999
hello 2 world,9981.05,43.33,444

csvtoxml.groovy </强>

#!/usr/bin/env groovy

def csvdata = []
new File("test.csv").eachLine { line ->
    csvdata << line.split(',')
}

def headers = csvdata[0]
def dataRows = csvdata[1..-1]

def xml = new groovy.xml.MarkupBuilder()

// write 'root' element
xml.root {
    dataRows.eachWithIndex { dataRow, index ->
        // write 'entry' element with 'id' attribute
        entry(id:index+1) {
            headers.eachWithIndex { heading, i ->
                // write each heading with associated content
                "${heading}"(dataRow[i])
            }
        }
    }
}

将以下XML写入stdout:


  
    hello world
    1.0
    3.3
    4
  
  
    goodbye world
    1e9
    -3.3
    45
  
  
    hello again
    -1
    23.33
    456
  
  
    hello world 3
    1.40
    34.83
    4999
  
  
    hello 2 world
    9981.05
    43.33
    444
  

但是,代码的解析非常简单(不考虑引号或转义逗号),并没有考虑到可能缺少的数据。

0
额外
锻炼留给读者?
额外 作者 Alan Krueger,
因此,您可以调用CSV库来执行解析,然后使用标记生成器。也许你可以编辑你的答案来证明这一点。
额外 作者 Peter Kelley,

Maybe this might help: JSefa

您可以使用此工具读取CSV文件并将其序列化为XML。

0
额外

一般来说,我有一个用于处理CSV和平面文件的开源框架。也许值得一看: JFileHelpers

使用该工具包,您可以使用bean编写代码,例如:

@FixedLengthRecord()
public class Customer {
    @FieldFixedLength(4)
    public Integer custId;

    @FieldAlign(alignMode=AlignMode.Right)
    @FieldFixedLength(20)
    public String name;

    @FieldFixedLength(3)
    public Integer rating;

    @FieldTrim(trimMode=TrimMode.Right)
    @FieldFixedLength(10)
    @FieldConverter(converter = ConverterKind.Date, 
    format = "dd-MM-yyyy")
    public Date addedDate;

    @FieldFixedLength(3)
    @FieldOptional
    public String stockSimbol;  
}

然后用下面的方法解析你的文本文件:

FileHelperEngine engine = 
    new FileHelperEngine(Customer.class); 
List customers = 
    new ArrayList();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

并且您将拥有一组经过分析的对象。

希望有所帮助!

0
额外
+1用于注释。不幸的是,截至今天,似乎该项目自2009-08-11以来没有任何新版本...
额外 作者 Stephan,
是的,自那以后我没有时间继续发展,但它非常稳定。
额外 作者 kolrie,

这个解决方案不需要任何CSV或XML库,我知道它不处理任何非法字符和编码问题,但是您也可能对它感兴趣,前提是您的CSV输入不会违反上述规则。

Attention: You should not use this code unless you know what you do or don't have the chance to use a further library (possible in some bureaucratic projects)... Use a StringBuffer for older Runtime Environments...

所以我们走吧:

BufferedReader reader = new BufferedReader(new InputStreamReader(
        Csv2Xml.class.getResourceAsStream("test.csv")));
StringBuilder xml = new StringBuilder();
String lineBreak = System.getProperty("line.separator");
String line = null;
List headers = new ArrayList();
boolean isHeader = true;
int count = 0;
int entryCount = 1;
xml.append("");
xml.append(lineBreak);
while ((line = reader.readLine()) != null) {
    StringTokenizer tokenizer = new StringTokenizer(line, ",");
    if (isHeader) {
        isHeader = false;
        while (tokenizer.hasMoreTokens()) {
            headers.add(tokenizer.nextToken());
        }
    } else {
        count = 0;
        xml.append("\t");
        xml.append(lineBreak);
        while (tokenizer.hasMoreTokens()) {
            xml.append("\t\t<");
            xml.append(headers.get(count));
            xml.append(">");
            xml.append(tokenizer.nextToken());
            xml.append("</");
            xml.append(headers.get(count));
            xml.append(">");
            xml.append(lineBreak);
            count++;
        }
        xml.append("\t");
        xml.append(lineBreak);
        entryCount++;
    }
}
xml.append("");
System.out.println(xml.toString());

输入test.csv(从本页另一个答案中窃取):

string,float1,float2,integer
hello world,1.0,3.3,4
goodbye world,1e9,-3.3,45
hello again,-1,23.33,456
hello world 3,1.40,34.83,4999
hello 2 world,9981.05,43.33,444

结果输出:


    
        hello world
        1.0
        3.3
        4
    
    
        goodbye world
        1e9
        -3.3
        45
    
    
        hello again
        -1
        23.33
        456
    
    
        hello world 3
        1.40
        34.83
        4999
    
    
        hello 2 world
        9981.05
        43.33
        444
    

0
额外

Jackson处理器家族拥有多种数据格式的后端,而不仅仅是JSON。这包括XML( https://github.com/FasterXML/jackson-dataformat-xml)和CSV( https://github.com/FasterXML/jackson-dataformat-csv/ )后端。

转换将依赖于使用CSV后端读取输入,使用XML后端进行写入。如果您有(或可以定义)每行(CSV)条目的POJO,这是最容易做到的。这不是一个严格的要求,因为来自CSV的内容也可以被读取为“无类型”(一串 String 数组),但是需要更多的XML输出工作。

对于XML方面,您需要一个包装器根对象来包含要序列化的对象的数组或 List

0
额外

For the CSV Part, you may use my little open source library

0
额外
你的图书馆有另一个链接吗?链接已经死亡。这就是为什么只链接答案的确切原因。
额外 作者 Magnilex,
虽然这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - 来自评论
额外 作者 Boo Berr'ita,

与上述其他人一样,我不知道采取任何一步办法,但如果您准备好使用非常简单的外部库,我会建议:

OpenCsv for parsing CSV (small, simple, reliable and easy to use)

Xstream to parse/serialize xml (very very easy to use, and creating fully human readable xml)

使用与上面相同的示例数据,代码如下所示:

package fr.megiste.test;

import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;

import com.thoughtworks.xstream.XStream;

public class CsvToXml {     

    public static void main(String[] args) {

        String startFile = "./startData.csv";
        String outFile = "./outData.xml";

        try {
            CSVReader reader = new CSVReader(new FileReader(startFile));
            String[] line = null;

            String[] header = reader.readNext();

            List out = new ArrayList();

            while((line = reader.readNext())!=null){
                List item = new ArrayList();
                    for (int i = 0; i < header.length; i++) {
                    String[] keyVal = new String[2];
                    String string = header[i];
                    String val = line[i];
                    keyVal[0] = string;
                    keyVal[1] = val;
                    item.add(keyVal);
                }
                out.add(item);
            }

            XStream xstream = new XStream();

            xstream.toXML(out, new FileWriter(outFile,false));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

产生以下结果: (Xstream可以非常精细地调整结果...)


  
    
      string
      hello world
    
    
      float1
      1.0
    
    
      float2
      3.3
    
    
      integer
      4
    
  
  
    
      string
      goodbye world
    
    
      float1
      1e9
    
    
      float2
      -3.3
    
    
      integer
      45
    
  
  
    
      string
      hello again
    
    
      float1
      -1
    
    
      float2
      23.33
    
    
      integer
      456
    
  
  
    
      string
      hello world 3
    
    
      float1
      1.40
    
    
      float2
      34.83
    
    
      integer
      4999
    
  
  
    
      string
      hello 2 world
    
    
      float1
      9981.05
    
    
      float2
      43.33
    
    
      integer
      444
    
  

0
额外

据我所知,没有现成的库可以为你做这件事,但是生成一个能够从CSV转换为XML的工具应该只需要你编写一个粗略的CSV解析器,并将JDOM(或者你的XML Java库选择)与一些胶水代码。

0
额外

没有什么我知道的,可以做到这一点,没有你至少写一点代码......你需要2个独立的库:

  • CSV解析器框架
  • XML序列化框架

我建议的CSV解析器(除非你想有一点乐趣来编写自己的CSV解析器)是OpenCSV(一个解析CSV数据的SourceForge项目)

如果您想将大型(或大型)CSV文件转换为XML,XML序列化框架应该可以扩展:我的建议是Sun Java Streaming xml Parser Framework(请参阅这里),它允许解析和序列化。

0
额外

Daniel Parker还有一个很好的图书馆 ServingXML ,它能够将几乎任何纯文本格式转换为XML并返回。

您的案例可以在这里找到:它使用CSV中的字段标题文件作为XML元素名称。

0
额外

您可以使用Groovy异常简单地执行此操作,并且代码非常易读。

基本上,文本变量将写入 contactData.csv 中的每一行的 contacts.xml ,并且fields数组包含每列。

def file1 = new File('c:\\temp\\ContactData.csv')
def file2 = new File('c:\\temp\\contacts.xml')

def reader = new FileReader(file1)
def writer = new FileWriter(file2)

reader.transformLine(writer) { line ->
    fields =  line.split(',')

    text = """
     ${fields[2]} 
     ${fields[1]} 
     ${fields[9]} 
     password 
    <title> ${fields[4]} </title>
     ${fields[3]} 
    """
}
0
额外
CSV很简单,但通常不够简单,以至于逗号分隔就足够了。
额外 作者 Alan Krueger,

您可以使用 XSLT 。谷歌它,你会发现一些例子,例如 CSV转换为XML 如果您使用 XSLT ,则可以将XML转换为您想要的任何格式。

0
额外

最大的区别是 JSefa 引入的是它可以将您的java对象序列化为CSV / xml / etc文件,并可以反序列化回java对象。它由注释驱动,可以让您对输出进行很多控制。

JFileHelpers也看起来很有趣。

0
额外

我有同样的问题,需要一个应用程序将CSV文件转换为我的项目之一的XML文件,但没有找到任何自由和足够好的网络,所以我编写了我自己的Java Swing CSVtoXML应用程序。

可以从我的网站这里下载。希望它能帮助你。

如果没有,您可以像我一样轻松编写您自己的代码;源代码位于jar文件中,因此如果不满足您的要求,请根据需要对其进行修改。

0
额外
虽然这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - 来自评论
额外 作者 Matthew Groves,