Input/Output CSV zu XML

Klingel

Mitglied
Hallo, :)

ich habe eine Klasse DataOperations die via JFileChooser eine .csv einliest und auf der Konsole als halbe .xml ausgibt. Jetzt würde ich gerne die Halbe .xml zu einer ganzen machen, mit den <?xml version="1.0" encoding="UTF-8" standalone="yes"?> im Kopf und dann seperat abspeichern als .xml.

Würde mich über Lösungsvorschläge freuen. Gruß

Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.*;
import javax.swing.filechooser.FileFilter;


public class DataOperations {
	
	File file;
	
	public File open(){
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Datei öffnen");
        fc.setFileFilter(new FileFilter() {
                public boolean accept(File f) {
                    return f.getName().toLowerCase().endsWith(".csv") || f.isDirectory();
                }
                public String getDescription() {
                    return "Comma-Separated Values(*.csv)";
                }
            });
        if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            System.out.println(file.getAbsolutePath());
            return file;
        }
        else System.out.println("Keine Auswahl");
        System.exit(0);
		return null;
    }

	private ArrayList<String> list = new ArrayList<String>();
	private String[] split = null;    
    
	public void readData() {
		try {
				FileReader fileRe = new FileReader(open().getAbsolutePath());
				BufferedReader data = new BufferedReader(fileRe);
				
				StringBuilder xml = new StringBuilder();
				String lineBreak = System.getProperty("line.separator");
				String line = null;
				ArrayList<String> headers = new ArrayList<String>();
				boolean isHeader = true;
				int count = 0;
				int entryCount = 1;
				xml.append("<root>");
				xml.append(lineBreak);

				
				while ((line = data.readLine()) != null) {
					split = line.split(";");
					StringTokenizer tokenizer = new StringTokenizer(line, ";");

					for(int i=0; i<split.length; i++) {
						//leere Zeilen ignorieren
						if( !(split[i].equals("")) )
						//eventuelle Leerzeichen zwischen zwei ';' entfernen 
						//und Wert in Liste schreiben
						list.add(split[i].trim());
					}
					
					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());
				
		} catch (FileNotFoundException e) {
			System.out.println("Datei nicht gefunden");
		} catch (IOException e) {
			System.out.println("E/A-Fehler");
		}
	}
	
	public void save(){
		JFileChooser JFilespeichern = new JFileChooser();
		JFilespeichern.setDialogTitle("Speichern unter");
		JFilespeichern.showSaveDialog(null);
	}
}
 
G

Gast2

Gast
Mach sowas lieber mit ner XML API wie z.B. JDOM. Da kannste auch documentes anlegen. Da brauchst du dich aber nicht selber um die Sytnax zu kümmern. Das sieht dann z.B: so aus:

Java:
  Document doc = new Document();
  Element root = new Element("GREETING");
  root.setText("Hello JDOM!");
  doc.setRootElement(root);

und das kommt dann raus:

Code:
<?xml version="1.0"?>
<GREETING>Hello JDOM!</GREETING>
 

Klingel

Mitglied
Vielen Dank! Jetzt kommt mir die Frage, wie ich meine CSV Datei mit JDom so einlese, dass die erste Zeile die Metatags bezeichnet, und die anderen Zeilen von diesen Metatags eingeschlossen werden? Gruß
 

Oben