java - parser - xml to excel online




Java庫或應用程序將CSV轉換為XML文件? (11)

Daniel Parker還提供了一個很好的 ServingXML 庫,該庫能夠將幾乎所有純文本格式轉換為XML並反向轉換。

您的案例示例可以在 here 找到:它使用CSV文件中的字段標題作為XML元素名稱。

Java中 是否有現有的應用程序或庫可讓我將 CSV 數據文件轉換為 XML 文件?

XML 標籤可能會通過包含列標題的第一行來提供。


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



您可以使用 XSLT 。 在Google上搜索,您會找到一些示例,例如 CSV到XML 如果使用 XSLT ,則可以將XML轉換為所需的任何格式。


我不明白您為什麼要這樣做。 聽起來幾乎像是貨物崇拜代碼。

將CSV文件轉換為XML不會增加任何值。 您的程序已經在讀取CSV文件,因此認為您需要XML無效。

另一方面,讀取CSV文件,對值進行處理,然後序列化為XML確實很有意義(嗯,就像使用XML一樣有意義...;)),但是您應該已經擁有一種方法序列化為XML。


我有一個開放源代碼框架,通常可以處理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文件,但是在網上找不到任何免費且足夠好的東西,所以我編寫了自己的Java Swing CSVtoXML應用程序。

可從我的網站 HERE 。 希望對您有幫助。

如果沒有,您可以像我一樣輕鬆地編寫自己的代碼。 源代碼位於jar文件中,因此如果不符合您的要求,請根據需要進行修改。


據我所知,尚沒有現成的庫可以為您完成此操作,但是要生成能夠將CSV轉換為XML的工具,只需要編寫一個粗糙的CSV解析器並連接JDOM(或您的XML Java庫選擇)與一些膠水代碼。


與上面的其他方法一樣,我不知道任何一步式方法,但是如果您準備使用非常簡單的外部庫,我建議:

OpenCsv 用於解析CSV(小巧,簡單,可靠且易於使用)

Xstream 解析/序列化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>

該解決方案不需要任何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>

JSefa 帶來的最大區別是,它可以將Java對象序列化為CSV / XML / etc文件,並且可以反序列化回Java對象。 它由註釋驅動,可以使您對輸出進行很多控制。

JFileHelpers看起來也很有趣。





data-conversion