*.csv Datein in XML konvertieren

Serpil

Mitglied
Hallo,

ich muss ein Programm schreiben, welches csv Datein mit Java einliest und daraus automatisch ein XML File erstellt. Hat vielleicht jemand eine Idee, wie ich da vorgehen kann?
Kenn mich mit Java an sich (was man halt so an der FH lernt) relativ gut aus, aber das mit dem Programmieren hab ich noch nicht so gut drauf.

Ich hab da schon ein bisschen was ausprobiert, funktioniert aber nicht wirklich so wie ich es will.

Code:
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class convert
{
	static Document document;
	String[] list;
	
	public static void main(String string[]) 
	{

		convert demo = new convert("C:/temp/test.xml");
		
		demo.createXMLBasic();
		demo.loadCSV("C:/temp/test.csv");
		demo.speichern("C:/temp/test.xml");
	}

	public convert(String string) 
	{
		newXMLFile(string);
	}

	public void newXMLFile(String string)
	{	
		try 
		{
			DocumentBuilderFactory factory = D ocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			document = builder.newDocument();
		} 
		catch (ParserConfigurationException pce) 
		{
			pce.printStackTrace();
		} 
		catch (Throwable t) 
		{
			t.printStackTrace();
		}
	}

	public void createXMLBasic() 
	{
		Element root = document.createElement("Person");
		document.appendChild(root);
	}

	public void loadCSV(String string) 
	{
		// Methode zum Laden von CSV
		
		String Zeile = "";
		try 
		{
			FileReader Eingabestrom = new FileReader(string);
			BufferedReader input = new BufferedReader(Eingabestrom);


			while ((Zeile = input.readLine()) != null) 
			{
				list = Zeile.split(";");			
				for(int i =0; i<list.length ;i++)
				{				
					addData(list[i]);

				}
			}			
			while (Zeile != null);
			input.close();
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}

	
	public void addData(String data) 
	{
		Element root = document.getDocumentElement();

		try 
		{			
			Element element = document.createElement(list[0]);
			root.appendChild(element);
						
			element.appendChild(document.createTextNode(data));
		} 
		catch (DOMException ex) 
		{
			ex.printStackTrace();
		}
	}
	
	public void speichern(String string) 
	{
		try 
		{
			FileWriter Ausgabestrom = new FileWriter(string);
			BufferedWriter output = new BufferedWriter(Ausgabestrom);
			
			String inhalt = "<?xml version='1.0' encoding='iso-8859-1' ?>\n";
			inhalt = inhalt + document.getDocumentElement().toString();
			System.out.println(inhalt); //Test
			output.write(inhalt, 0, inhalt.length());
			output.close();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
}



Bin für jede Hilfe dankbar.
Vielen dank im Voraus.

Gruß Serpil
 
Hallo,

Was genau funktioniert denn nicht?

Wenn es an der Ausgabe liegt, könntest du jdom verwenden. Da gibt es eine Klasse die heißt XMLOutputter. Mit der kannst du einen DOM-Baum in eine Datei schreiben. Wenn du jdom nicht verwenden willst, dann musst du dir das selbst schreiben.



MFG
 
Zuletzt bearbeitet:
Ich habe z.B die csv Datei

Vorname;Name;Geb.Datum;Ort
Muster;Mustermann;30.03.2007;Ismaning

und meine Ausgabe ist:

Code:
<Person>
     <Vorname>Vorname</Vorname>
     <Vorname>Name</Vorname>
     <Vorname>Geb.Datum</Vorname>
     <Vorname>Ort</Vorname>
     <Muster>Muster</Muster>
     <Muster>Mustermann</Muster>
     <Muster>30.03.2007</Muster>
     <Muster>Ismaning</Muster>
</Person>


Es müsste aber z.B so aussehen

Code:
<Person>
<Vorname> Muster </Vorname>
<Name>  Mustermann </Name>
<Geb.Datum> 30.03.2007</Geb.Datum>
<Ort> München</Ort>
</Person>


Leider kriege ich es nicht hin dass er mir die erste zeile der Datei als Tags ausgibt.
 
Hallo,

ist klar. :)

Du schreibst in deine Liste alle Wörter der ersten Zeile (Vorname;Name;Geb.Datum;Ort), übergibst dann in der for-Schleife list(i), das entspricht jedem Wort aus der ersten Zeile. In deine Methode addData schreibst du dann
Code:
Element element = document.createElement(list(0));
, das entspricht bei der ersten Zeile "Vorname". Da der Aufruf der Methode in einer Schleife steht wird das ganze halt immer wieder aufgerufen (5x). Also wird genau so oft list(0) als Element genommen. Und das steht ja die ganze zeit auf "Vorname". Ich hoffe ich habe mich verständlich ausgedrückt.

PS: Als Outputter könntest eine solche Klasse nehmen:
Code:
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;



/**
 * 
 */
public class XMLOutputter
{

  public void output(Document document, OutputStream out ){
    PrintWriter writer = new PrintWriter(out);
    travers(document,writer);
  }
  
  private void travers(Node node, PrintWriter out){
    switch(node.getNodeType()){
      case Document.DOCUMENT_NODE:
        NodeList list=node.getChildNodes();
        out.println("<?xml version='1.0' encoding='iso-8859-1' ?>");
        for(int i=0; i< list.getLength();i++){
          travers(list.item(i), out);
        }
        break;
      case Document.ELEMENT_NODE: 
        list=node.getChildNodes();
        out.println("<"+node.getNodeName()+">");
        for(int i=0; i< list.getLength();i++){
          travers(list.item(i), out);
        }
        out.println("</"+node.getNodeName()+">");
        break;
      case Document.TEXT_NODE:
        out.println(node.getNodeValue());
        break;
    }
  }
  
}
 
Zuletzt bearbeitet:
Danke für deine Antwort.

Ja ich habe verstanden was du meinst. Aber ich kann in der liste nur zeilenweise speichern.
Das möchte ich eigentlich gar nicht, aber anders kriege ich es nicht hin.

Meine Idee ist es alles in einer liste (nicht zeilenweise) zu speicher und daraus dann die Tags zu speichern (kriege ich leider nicht hin)
Weisst du vielleicht wie ich das realisieren könnte oder hast du eventuell eine bessere Lösung.

Gruß
 
Ich hab hier deine Klasse mal abgeändert. So funktioniert es mal mit deiner csv-datei. Es funktioniert allerdings nicht mehr, wenn die Daten Lücken enthalten (z.b. Muster;;;Ismaning), aber es ist mal ein gedankenanstoß.

Code:
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class convert
{
  static Document document;
  String[] list;
  String[] head;
  
  public static void main(String string[]) 
  {

    convert demo = new convert("C:/temp/test.xml");
    
    demo.createXMLBasic();
    demo.loadCSV("d:/test.csv");
    demo.speichern("d:/test.xml");
  }

  public convert(String string) 
  {
    newXMLFile(string);
  }

  public void newXMLFile(String string)
  { 
    try 
    {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      document = builder.newDocument();
    } 
    catch (ParserConfigurationException pce) 
    {
      pce.printStackTrace();
    } 
    catch (Throwable t) 
    {
      t.printStackTrace();
    }
  }

  public void createXMLBasic() 
  {
    Element root = document.createElement("Person");
    document.appendChild(root);
  }

  public void loadCSV(String string) 
  {
    // Methode zum Laden von CSV
    
    String Zeile = "";
    try 
    {
      FileReader Eingabestrom = new FileReader(string);
      BufferedReader input = new BufferedReader(Eingabestrom);

      if((Zeile = input.readLine()) != null){
        head = Zeile.split(";");
        while ((Zeile = input.readLine()) != null) 
        {
          list = Zeile.split(";");      
          addData(list);
        }  
      }
      while (Zeile != null);
      input.close();
    }
    catch (IOException e) 
    {
      e.printStackTrace();
    }
  }

  
  public void addData(String[] data) 
  {
    Element root = document.getDocumentElement();

    try 
    { 
      for(int i =0; i<head.length ;i++)
      {       
        Element element = document.createElement(head[i]);
        root.appendChild(element);
        element.appendChild(document.createTextNode(data[i]));
      }
               
      
    } 
    catch (DOMException ex) 
    {
      ex.printStackTrace();
    }
  }
  
  public void speichern(String string) 
  {
    try 
    {
      XMLOutputter outputter = new XMLOutputter();
      
      outputter.output(document,new FileOutputStream(string));
    } 
    catch (IOException e) 
    {
      e.printStackTrace();
    }
  }
}

Ich hab hier auch die oben angegebene Klasse verwendet.

MFG
 
Vorerst mal danke. Werde mir das mal in Ruhe anschauen und hoffen dass es funktioniert.
Danke für deine Hilfe... :)

Gruß
Serpil
 
Leider schon das erste Problem
Ich bekomme folgende Fehleranzeige
Hatte ich vorher auch beim rumprobieren, weiss aber leider nicht woran es liegt.


Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method output(String, OutputStream) in the type XMLOutputter is not applicable for the arguments (Document, FileOutputStream)
 
Hattest du irgendwas verändert?

Poste mal bitte wieder die Klasse. Es gibt nämlich keine Methode output(String, OutputStream).

Hast du die Klasse XMLOutputter von mir kopiert? Also die, die ich oben gepostet hab.
 
jetzt habe ich die richtige klasse genommen. Wie dumm von mir.

Naja es funktioniert auf jedenfall immer noch nicht!!
Bei dir hat es funktioniert oder was
Also irgendwas mache ich falsch. Ich schau mal woran es liegen könnte...
 

Neue Beiträge

Zurück