是否有现有的应用程序或库 爪哇 这将允许我转换 CSV 数据文件到 XML 文件?

XML 标签可能通过包含列标题的第一行提供。

有帮助吗?

解决方案

也许这可能有帮助: 杰瑟法

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

其他提示

与上面的其他人一样,我不知道有任何一步方法可以做到这一点,但如果您准备使用非常简单的外部库,我建议:

开放式CSV 用于解析 CSV(小、简单、可靠且易于使用)

流媒体 解析/序列化 XML(非常非常容易使用,并创建完全人类可读的 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<String[]> item = new ArrayList<String[]>();
                    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 允许对结果进行非常精细的调整...)

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

我知道您要求使用 Java,但我认为这是一项非常适合脚本语言的任务。这是一个用 Groovy 编写的快速(非常简单)的解决方案。

测试.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 写入标准输出:

<root>
  <entry id='1'>
    <string>hello world</string>
    <float1>1.0</float1>
    <float2>3.3</float2>
    <integer>4</integer>
  </entry>
  <entry id='2'>
    <string>goodbye world</string>
    <float1>1e9</float1>
    <float2>-3.3</float2>
    <integer>45</integer>
  </entry>
  <entry id='3'>
    <string>hello again</string>
    <float1>-1</float1>
    <float2>23.33</float2>
    <integer>456</integer>
  </entry>
  <entry id='4'>
    <string>hello world 3</string>
    <float1>1.40</float1>
    <float2>34.83</float2>
    <integer>4999</integer>
  </entry>
  <entry id='5'>
    <string>hello 2 world</string>
    <float1>9981.05</float1>
    <float2>43.33</float2>
    <integer>444</integer>
  </entry>
</root>

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

我有一个开源框架,用于一般处理 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<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

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

您将拥有一个已解析对象的集合。

希望有帮助!

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

注意力: 您不应该使用此代码,除非您知道自己做什么或没有机会使用进一步的库(可能在某些官僚项目中)...对较旧的运行时环境使用 StringBuffer...

那么我们开始吧:

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<String> headers = new ArrayList<String>();
boolean isHeader = true;
int count = 0;
int entryCount = 1;
xml.append("<root>");
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<entry id=\"");
        xml.append(entryCount);
        xml.append("\">");
        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</entry>");
        xml.append(lineBreak);
        entryCount++;
    }
}
xml.append("</root>");
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

结果输出:

<root>
    <entry id="1">
        <string>hello world</string>
        <float1>1.0</float1>
        <float2>3.3</float2>
        <integer>4</integer>
    </entry>
    <entry id="2">
        <string>goodbye world</string>
        <float1>1e9</float1>
        <float2>-3.3</float2>
        <integer>45</integer>
    </entry>
    <entry id="3">
        <string>hello again</string>
        <float1>-1</float1>
        <float2>23.33</float2>
        <integer>456</integer>
    </entry>
    <entry id="4">
        <string>hello world 3</string>
        <float1>1.40</float1>
        <float2>34.83</float2>
        <integer>4999</integer>
    </entry>
    <entry id="5">
        <string>hello 2 world</string>
        <float1>9981.05</float1>
        <float2>43.33</float2>
        <integer>444</integer>
    </entry>
</root>

最大的区别在于 杰瑟法 带来的好处是它可以将 java 对象序列化为 CSV/XML/etc 文件,并可以反序列化回 java 对象。它由注释驱动,使您可以对输出进行大量控制。

JFileHelpers 看起来也很有趣。

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

将 CSV 文件转换为 XML 不会增加任何价值。您的程序已经在读取 CSV 文件,因此认为您需要 XML 是行不通的。

另一方面,读取 CSV 文件,执行以下操作 某物 值,然后序列化为 XML 确实有意义(嗯,就像使用 XML 一样有意义......;)) 但您应该已经有了序列化为 XML 的方法。

使用 Groovy 可以非常轻松地完成此操作,并且代码非常可读。

基本上,文本变量将被写入 contacts.xml 对于中的每一行 contactData.csv, ,并且 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 = """<CLIENTS>
    <firstname> ${fields[2]} </firstname>
    <surname> ${fields[1]} </surname>
    <email> ${fields[9]} </email>
    <employeenumber> password </employeenumber>
    <title> ${fields[4]} </title>
    <phone> ${fields[3]} </phone>
    </CLIENTS>"""
}

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

还有很好的图书馆 服务XML 由 Daniel Parker 开发,它能够将几乎所有纯文本格式与 XML 相互转换。

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

据我所知,如果您至少编写一点代码,就无法做到这一点......您将需要 2 个独立的库:

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

我推荐的 CSV 解析器(除非您想有一点乐趣来编写自己的 CSV 解析器)是 OpenCSV(用于解析 CSV 数据的 SourceForge 项目)

XML 序列化框架应该是可以扩展的,以防您想要将大型(或巨大)CSV 文件转换为 XML:我的推荐是 Sun Java Streaming XML Parser Framework(请参阅 这里)允许拉式解析和序列化。

据我所知,没有现成的库可以为您执行此操作,但是生成一个能够从 CSV 转换为 XML 的工具只需要您编写一个粗略的 CSV 解析器并连接 JDOM(或您的 XML Java 库)选择)和一些粘合代码。

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 要序列化的对象。

这可能是太基本或有限的解决方案,但你不能做一个 String.split() 在文件的每一行上,记住第一行的结果数组来生成 XML,然后用适当的 XML 元素填充循环的每次迭代来吐出每行的数组数据?

我遇到了同样的问题,需要一个应用程序将 CSV 文件转换为 XML 文件以用于我的一个项目,但在网上没有找到任何免费且足够好的东西,因此我编写了自己的 Java Swing CSVtoXML 应用程序。

它可以从我的网站获得 这里. 。希望它能帮助你。

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

对于 CSV 部分,您可以使用 我的小开源库

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top