# *.csv Datein in XML konvertieren



## Serpil (30. März 2007)

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. 


```
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


----------



## zerix (30. März 2007)

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


----------



## Serpil (30. März 2007)

Ich habe z.B die csv Datei 

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

 und meine Ausgabe ist:


```
<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


```
<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.


----------



## zerix (30. März 2007)

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 
	
	
	



```
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:
	
	
	



```
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;
    }
  }
  
}
```


----------



## Serpil (30. März 2007)

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ß


----------



## zerix (30. März 2007)

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ß.


```
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


----------



## Serpil (30. März 2007)

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

Gruß 
Serpil


----------



## Serpil (30. März 2007)

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)


----------



## zerix (30. März 2007)

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.


----------



## Serpil (30. März 2007)

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...


----------



## zerix (30. März 2007)

Also bei mir hat es funktioniert. Welche Ausgabe hast du denn?


----------



## Serpil (30. März 2007)

Wenn ich die xml datei aufmache zeigt der browser  folgendes.

XML-Verarbeitungsfehler: Kein Element gefunden
Adresse: file:///C:/temp/serpil.xml
Zeile Nr. 1, Spalte 1:
^


----------



## zerix (30. März 2007)

Schau dir die Datei mal in einem Editor an. Schau mal ob da alles drin steht. Der IExplorer zeigt die nicht an, weil in der datei ein Fehler ist.


----------



## Serpil (30. März 2007)

wenn ich es mit dem Editor aufmache steht auch nichts drin.
Der zeigt mir eine leere datei an.


----------



## zerix (30. März 2007)

Poste mal bitte noch einmal die Klasse und wenn es möglich ist hänge mal bitte die cvs-datei mit an. danke.


----------



## Serpil (30. März 2007)

```
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/serpil.xml");
    
    demo.createXMLBasic();
    demo.loadCSV("C:/temp/serpil.csv");
    demo.speichern("C:/temp/serpil.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 kann leider die .csv datei nicht mit anhängen. Der lädt das nicht hoch.

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


----------



## zerix (31. März 2007)

Also ich hab genau die gleichen Klassen und die gleiche cvs-Datei und bei mir funktioniert es. Bin jetzt aber leider nicht an meinem Rechner. Wenn ich wieder dran bin, schreib ich dir mal eine Beispiel-Klasse.

MFG
zEriX


----------



## Serpil (2. April 2007)

Hatte jetzt am Wochenende auch keine zeit zum reinschauen.
Werde mich aber heute damit beschäftigen und hoffe das ich Erfolg habe.
Vielen Danke für deine Bemühungen

Gruß


----------



## Serpil (2. April 2007)

Also ich weiss echt nicht woran es liegt. 
Wenn ich es als test in der console ausgebe, gibt er es mir aus.


----------



## zerix (2. April 2007)

Hallo, 
mit diesen Klassen funktioniert es.


```
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 = makeArrayForXML(zeile);      
          addData(list);
        }  
      }
      
      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);
        if(!data[i].equals("nullString"))
          element.appendChild(document.createTextNode(data[i]));
      }
               
      
    } 
    catch (DOMException ex) 
    {
      ex.printStackTrace();
    }
  }
  
  
  private String[] makeArrayForXML (String zeile){
    if(zeile.startsWith(";")){
      zeile = ";"+zeile;
    }
    for(int i = 0; i < 2; i++){
      zeile = zeile.replaceAll(";;", ";nullString;");
    }
    return zeile.split(";");
  }
  
  public void speichern(String string) 
  {
    try 
    {
      XMLOutputter outputter = new XMLOutputter();
      
      outputter.output(document,new FileOutputStream(string));
    } 
    catch (IOException e) 
    {
      e.printStackTrace();
    }
  }
}
```


```
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);
    writer.close();
  }
  
  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;
    }
  }
  
  
}
```



MFG 
zerix


----------



## Serpil (2. April 2007)

danke dir vielmals für deine Hilfe.
Es wundert mich aber immer noch warum es mit der anderen Klasse nicht funktioniert hat.
Immerhin hat er es in der Console richtig ausgegeben. 
Naja ich schau es mir noch an und falls ich was finde poste ich es.

Nochmal herzlichen dank.
Gruß 
Serpil


----------



## zerix (2. April 2007)

Hallo,

also es ist keine Musterlösung, aber es ist eine die funktioniert.  Auf jeden Fall müsstest du jetzt weiter kommen. Achja, meine letzte Lösung hat jeztt nicht funktioniert, weil ich einen Fehler hatte. Hatte
	
	
	



```
writer.close()
```
 vergessen *schäm*

MFG


----------



## Serpil (2. April 2007)

Danke. 
Ich war echt kurz vorm verzweifeln. 
Ich hätte den Fehler niemals gefunden..
Gruß


----------



## zerix (2. April 2007)

Na deshalb hab ich ja noch mal die Klassen richtig gepostet. Hatte ja an deiner Klasse auch noch mal was geändert.


----------



## Serpil (16. April 2007)

Also hab wieder ein Problem mit meinem Programm. Wäre super wenn mir jemand behilflich sein könnte. Also es geht um folgendes.
Ich versuche ein Xml Dokument zu erstellen in dieser Form:

```
<root>
	<element 1>
		<element 2>
		</element 2>

		<element 2>
		</element 2>
	</element 1>
</root>
```

aber leider kriege ich diese Hirarchie raus


```
<root>
	<element 1>
		<element 2>
		</element 2>
	</element 1>
	
	<element 1>
		<element 2>
		</element 2>
	</element 1>
</root>
```

hänge nochmal meinen Code mit an weil ich einiges geändert habe.

```
import java.io.*;
import javax.xml.parsers.*;

import org.w3c.dom.*;

public class Converter 
{
	static Document document;
	static String[] list;
	String[] head ;	
	String[] name;
	
	public static void main(String string[]) 
	{
		Converter demo = new Converter("C:/temp/test.xml");
		demo.createXMLBasic();
		demo.loadCSV("C:/temp/test.csv");
		demo.saveXML("C:/temp/test.xml");
	}
	public Converter(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("TestTest");
		document.appendChild(root);
	}
	
	public void loadCSV(String string) 
	{
		// Methode zum Laden von CSV
		String line = "";
		try 
		{
			FileReader inputStream = new FileReader(string);
			BufferedReader input = new BufferedReader(inputStream);
						
			if((line = input.readLine()) != null)
			{
				if(line.contains("#"))
					line = line.substring(1);
				
				name = line.split(";");
				
				if ((line = input.readLine()) != null) 
				{
					head = line.split(";");
					
					while ((line = input.readLine()) != null) 
					{					
						list = line.split(";");
						addData(list);						
					}				
				}	
			}			

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

	public void addData(String[] data)
	{		
		Element root = document.getDocumentElement();
		try 
		{	
			Element gattung = document.createElement("Test");
			root.appendChild(gattung);
						
			Element zero = document.createElement(name[0]);
			gattung.appendChild(zero);
			
			for (int i = 0; i < data.length; i++) //ArrayIndexOutOfBoundsException --> head[19] != data[18] ?
			{				
				Element element = document.createElement(head[i]);
				zero.appendChild(element);	
				element.appendChild(document.createTextNode(data[i])); 
			}			
		}
		catch (DOMException ex)
		{
			ex.printStackTrace();
		}
	}	

	public void saveXML(String string)
	{
		try 
		{
			XMLOutputterNeu outputter = new XMLOutputterNeu();
			outputter.output(document, new FileOutputStream(string));
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
}
```



```
import java.io.*;
import org.w3c.dom.*;

public class XMLOutputterNeu
{
	public void output(Document document, OutputStream out) 
	{
		PrintWriter writer = new PrintWriter(out);
		travers(document, writer);
		writer.close();
	}

	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='UTF-8'?>");
			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;
		}
	}
}
```
Bin für jede noch so kleine Hilfe dankbar.
Gruss


----------



## zerix (16. April 2007)

Hallo,

Könntest du bitte mal eine CVS-Beispieldatei posten und sagen was zusammen in ein Element soll?

MFG

zEriX


----------



## Serpil (16. April 2007)

```
#ZEROBOND
EMITTENT;FAELLIGKEIT;FINANZPLATZ;INTERN;NAME;RUECKZAHLUNGSKURS;TEILMARKT;USANCE;VALUTATAGE;WAEHRUNG;WPRKENNUMMER;EMISSIONSDATUM;EMISSIONSRENDITE;ISIN;REIHE;ERSTELLUNGSDATUM;LGD_KONFIGURATION;LGD_KLASSE;GAT_KOMMENTAR
BASF AG;24.04.2002;Frankfurt;PIA11042007164749937zb;Zerobond-0019;6,3000000000;IHS;ICMA-251;2;EUR;ZO0019;01.01.2000;0,0000000000;ZERO-0000019;;11.04.2007;ungenutzt;ungenutzt;
BASF 
AG;24.04.2002;Frankfurt;PIA11042007164749937zb;Zerobond-0019;6,3000000000;IHS;ICMA-251;2;EUR;ZO0019;01.01.2000;0,0000000000;ZERO-0000019;;11.04.2007;ungenutzt;ungenutzt;
```

Das ist meine csv datei.
und es soll so aussehen

```
<sDISPlusImport>
	<IGattung>
	         <ZEROBOND>
                </ZEROBOND>
                
                <ZEROBOND>
                </ZEROBOND>
	</IGattung>
</sDISPlusImport>
```

Die ersten beiden elemente bleiben immer gleich.
Nur das Element <Zerobond> ändert sich und muss aus der csv datei herausgelesen werden.
Gruss Serpil


----------



## zerix (16. April 2007)

Also nur zum Verständis, das was hinter '#' steht wird das Parent-Element für die Daten die in der CVS-Datei stehen, oder?


----------



## Serpil (16. April 2007)

ja genau.. Ich häng dir nochmal die richtige datei an.
so sollte es aussehen:


```
<?xml version="1.0" encoding="UTF-8"?>
<sDISPlusImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="import.xsd">
	<IGattung>
		<IZerobond>
			<produkt>Zerobond</produkt>
			<isin>DE4711</isin>
			<wkn>4711</wkn>
			<bezeichnung>bezeichnung</bezeichnung>
			<kurzbezeichnung>kurzbezeichnung</kurzbezeichnung>
			<teilmarkt>Swap</teilmarkt>
			<waehrung>EUR</waehrung>
			<landiso>DEU</landiso>
			<branche>Bau</branche>
			<valutaregel>0</valutaregel>
			<finanzplatz>Frankfurt</finanzplatz>
			<emittent>emittent</emittent>
			<boersennotiert>EU regulated markets</boersennotiert>
			<kursversorgt>true</kursversorgt>
			<faelligkeit>2001-01-01</faelligkeit>
			<rueckzahlungskurs>100.0</rueckzahlungskurs>
			<emissionsdatum>2001-01-01</emissionsdatum>
		</IZerobond>
		<IZerobond>
			<produkt>Zerobond</produkt>
			<isin>DE4711</isin>
			<wkn>4711</wkn>
			<bezeichnung>bezeichnung</bezeichnung>
			<kurzbezeichnung>kurzbezeichnung</kurzbezeichnung>
			<teilmarkt>Swap</teilmarkt>
			<waehrung>EUR</waehrung>
			<landiso>DEU</landiso>
			<branche>Bau</branche>
			<valutaregel>0</valutaregel>
			<finanzplatz>Frankfurt</finanzplatz>
			<emittent>emittent</emittent>
			<boersennotiert>EU regulated markets</boersennotiert>
			<kursversorgt>true</kursversorgt>
			<faelligkeit>2001-01-01</faelligkeit>
			<rueckzahlungskurs>100.0</rueckzahlungskurs>
			<emissionsdatum>2001-01-01</emissionsdatum>
		</IZerobond>
	</IGattung>
</sDISPlusImport>
```

aber meins sieht so aus.


```
<?xml version='1.0' encoding='UTF-8'?>
<sDISPlusImport>
	<IGattung>
		<ZEROBOND>
			<EMITTENT> BASF AG </EMITTENT>
			<FAELLIGKEIT> 24.04.2002 </FAELLIGKEIT>
			<FINANZPLATZ> Frankfurt </FINANZPLATZ>
			<INTERN> PIA11042007164749937zb </INTERN>
			<NAME> Zerobond-0019 </NAME>
			<RUECKZAHLUNGSKURS> 6,3000000000 </RUECKZAHLUNGSKURS>
			<TEILMARKT> IHS </TEILMARKT>
			<USANCE> ICMA-251 </USANCE>
			<VALUTATAGE> 2 </VALUTATAGE>
			<WAEHRUNG> EUR </WAEHRUNG>
			<WPRKENNUMMER> ZO0019 </WPRKENNUMMER>
			<EMISSIONSDATUM> 01.01.2000 </EMISSIONSDATUM>
			<EMISSIONSRENDITE> 0,0000000000 </EMISSIONSRENDITE>
			<ISIN> ZERO-0000019 </ISIN>
			<REIHE> </REIHE>
			<ERSTELLUNGSDATUM> 11.04.2007 </ERSTELLUNGSDATUM>
			<LGD_KONFIGURATION> ungenutzt </LGD_KONFIGURATION>
			<LGD_KLASSE> ungenutzt </LGD_KLASSE>
		</ZEROBOND>
	</IGattung>
	<IGattung>
		<ZEROBOND>
			<EMITTENT> BASF AG </EMITTENT>
			<FAELLIGKEIT> 24.04.2002 </FAELLIGKEIT>
			<FINANZPLATZ> Frankfurt </FINANZPLATZ>
			<INTERN> PIA11042007164749937zb </INTERN>
			<NAME> Zerobond-0019 </NAME>
			<RUECKZAHLUNGSKURS> 6,3000000000 </RUECKZAHLUNGSKURS>
			<TEILMARKT> IHS </TEILMARKT>
			<USANCE> ICMA-251 </USANCE>
			<VALUTATAGE> 2 </VALUTATAGE>
			<WAEHRUNG> EUR </WAEHRUNG>
			<WPRKENNUMMER> ZO0019 </WPRKENNUMMER>
			<EMISSIONSDATUM> 01.01.2000 </EMISSIONSDATUM>
			<EMISSIONSRENDITE> 0,0000000000 </EMISSIONSRENDITE>
			<ISIN> ZERO-0000019 </ISIN>
			<REIHE> </REIHE>
			<ERSTELLUNGSDATUM> 11.04.2007 </ERSTELLUNGSDATUM>
			<LGD_KONFIGURATION> ungenutzt </LGD_KONFIGURATION>
			<LGD_KLASSE> ungenutzt </LGD_KLASSE>
		</ZEROBOND>
	</IGattung>
</sDISPlusImport>
```

die attribute brauchst du nicht zu beachten. die sind im moment zweitrangig.
Ich hab schon alles mögliche ausprobiert aber es funktioniert einfach nicht und ich komm auch nicht drauf woran es liegen könnte.
gruss


----------



## zerix (16. April 2007)

So, dein Fehler war, dass du immer wieder einen neues Element Namens "Test" angelegt hast.

```
public void addData(String[] data)
	{		
		Element root = document.getDocumentElement();
		try 
		{	
			Element gattung = document.createElement("Test");
			root.appendChild(gattung);
```

Hiermit müsste es jetzt funktionieren.

```
import java.io.*;
import javax.xml.parsers.*;

import org.w3c.dom.*;

public class Converter
{
  static Document document;
  static String[] list;
  String[] head ; 
  String[] name;
  
  public static void main(String string[]) 
  {
    Converter demo = new Converter();
    demo.createXMLBasic();
    demo.loadCSV("C:/temp/test.csv");
    demo.saveXML("C:/temp/test.xml");
  }
  public Converter() 
  {
    newXMLFile();
  }
  
  public void newXMLFile() 
  {
    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("TestTest");
    document.appendChild(root);
  }
  
  public void loadCSV(String string) 
  {
    // Methode zum Laden von CSV
    String line = "";
    try 
    {
      FileReader inputStream = new FileReader(string);
      BufferedReader input = new BufferedReader(inputStream);
            
      if((line = input.readLine()) != null)
      {
        if(line.contains("#"))
          line = line.substring(1);
        
        name = line.split(";");
        
        if ((line = input.readLine()) != null) 
        {
          head = line.split(";");
          
          while ((line = input.readLine()) != null) 
          {         
            list = line.split(";");
            addData(list, "TestTest");            
          }       
        } 
      }     

      
      input.close();
    } 
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }

  public void addData(String[] data, String gattungsID)
  {   
    Element root = document.getDocumentElement();
    try 
    { 
      Element gattung = (Element)document.getElementsByTagName(gattungsID).item(0);
      
      if(gattung == null){
        gattung = document.createElement(gattungsID);
        root.appendChild(gattung);
      }
            
      Element zero = document.createElement(name[0]);
      gattung.appendChild(zero);
      
      for (int i = 0; i < data.length; i++) //ArrayIndexOutOfBoundsException --> head[19] != data[18] ?
      {       
        Element element = document.createElement(head[i]);
        zero.appendChild(element);  
        element.appendChild(document.createTextNode(data[i])); 
      }     
    }
    catch (DOMException ex)
    {
      ex.printStackTrace();
    }
  } 

  public void saveXML(String string)
  {
    try 
    {
      XMLOutputterNeu outputter = new XMLOutputterNeu();
      outputter.output(document, new FileOutputStream(string));
    } 
    catch (IOException e) 
    {
      e.printStackTrace();
    }
  }
}
```



MFG

zEriX


----------



## Serpil (17. April 2007)

ich danke dir vielmals. Es funktioniert einwandfrei.
Vielen dank für deine Bemühungen.

Gruss Serpil


----------



## Serpil (19. April 2007)

> Es funktioniert einwandfrei.


Leider doch nicht 

Ich bin echt am verzweifeln.
Jetzt habe ich schon wieder ein problem. Meine csv datei hat zwei verschiedene längen.
Damit meine ich dass die erste zeile 19 und die zweite zeile 18 werte hat. Dies führt jetzt dazu dass er mir bei dem 18 wert aufhört und kein tag mehr erzeugt. Es fehlt mir also der <Gat_Kommentar>  </Gat_Kommentar> tag ohne ihhalt. Und ich weiss schon wo der fehler ist:

```
for (int i = 0; i < data.length ; i++)
	{
		Element element = document.createElement(head[i]);
		zero.appendChild(element);				
		element.appendChild(document.createTextNode(data[i]));
	}
```

weiss aber leider nicht wie ich ihn umgehen kann.
zerix ich hoffe ich belästige dich nicht all zu sehr. du bist der einzige der mir antwortet.

Deshalb gleich noch eine Frage:
Man kann in Xml keine tags erzeugen die mit ziffern beginnen. Jetzt habe ich aber das problem dass ich in meiner csv datei zeilen habe die mit zahlen beginnen.
Kann ich dieses Problem irgendwie umgehen oder gibt es da überhaupt keine möglichkeit (davon gehe ich aus).

Danke im voraus


----------



## Serpil (11. Mai 2007)

hi, hab ne Frage eigentlich allgemein. War mir nicht sicher ob ich ein neues Thema erstellen soll, da es ja eigentlich noch zu diesem code gehört. Ich poste es jetzt einfach mal hier rein. (Beschwerden bitte an mich  )
und zwar weiss ich nicht wie ich dieses element erzeugen soll.

```
<sDISPlusImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="import.xsd">
```
ich krieg es einfach nicht hin. sDISPlusImport ist mein root element.
Danke für jeden tip...

Lg Serpil


----------



## limago (11. Mai 2007)

```
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

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

public class AttributeDemo {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setNamespaceAware(true);
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.newDocument();

		Element root = document.createElement("sDISPlusImport");
		root.setAttributeNS("http://www.w3.org/2001/XMLSchema-instance",
				"xsi:noNamespaceSchemaLocation", "import.xsd");

		document.appendChild(root);

		TransformerFactory.newInstance().newTransformer().transform(
				new DOMSource(document), new StreamResult(System.out));

	}

}
```

Ausgabe:


```
<?xml version="1.0" encoding="UTF-8" standalone="no"?><sDISPlusImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="import.xsd"/>
```


----------



## Serpil (14. Mai 2007)

erstmal danke für die antwort. Hab es mir am Wochenende in Ruhe angeschaut. Ich kriege aber nicht das gleiche raus wie du!

Bei mir sieht die Ausgabe so aus:

```
<?xml version="1.0" encoding="UTF-8"?>
<sDISPlusImport xsi:noNamespaceSchemaLocation="import.xsd"/>
```

hab bisschen rumprobiert weiss aber nicht woran es liegt.

Eine Frage hätte ich noch:
Beim StreamResult steht ja System.out der gibt es in der console aus. Ich krieg es nicht hin dass der mir das in meine xml datei einbindet.
Wäre echt super wenn du mir da auch helfen könntest.

Viele Liebe Grüße
Serpil


----------



## zerix (14. Mai 2007)

Hallo,

wenn du das in eine Datei schreiben willst, musst du einen FileOutputStream einbinden. System.out ist auch einfach nur ein OutputStream. Du kannst an der Stelle jeden OutputStream übergeben den du willst.

MFG

zEriX


----------



## Serpil (14. Mai 2007)

hi,
danke dier vielmals. Habs grad auch rausgekriegt und wollte es reinschreiben aber du warst ein tick schneller.  
Lg Serpil


----------



## Serpil (14. Mai 2007)

habs jetzt hingekriegt. weiss nicht ob das so elegant ist aber es funktioniert auf jeden fall.
Falls es jemanden interessiert hier mein code:

```
Element root = document.createElement("sDISPlusImport" );
root.setAttributeNS(" ","xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
root.setAttributeNS(" ","xsi:noNamespaceSchemaLocation","import.xsd");	
document.appendChild(root);
```


```
OutputStream out = new FileOutputStream(XMLFile);  
PrintWriter writer = new PrintWriter(out);
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(out));
writer.close();
```

und hier die Ausgabe:

```
<?xml version="1.0" encoding="UTF-8"?>
<sDISPlusImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="import.xsd">
```

Gruß Serpil


----------

