# <root> node in bestehendes XML-File



## Maxl (11. Okt 2012)

Hallo Zusammen,

ich bin neu hier und auch neu im Bereich Java.
Ich habe ein kleines Problem beim einlesen einer XML Datei mit Java bzw. DOM.
Hier mal ein XML Beispiel, welches meinem ähnelt:
[XML]<cdr_data>
	  <date>2012-06-24</date>
	  <time>00:00:33</time>
	  <call_reference_id>012-03-001-060-353-025-391-613</call_reference_id>
	  <sip_account>4931119981013</sip_account>
	  <customer_id>12321</customer_id>
	  <customer_id_addon></customer_id_addon>
	  <a-number>4523960042</a-number>
	  <b-number>4953612210572</b-number>
	  <billing_seconds>31</billing_seconds>
	  <callduration>31</callduration>
	  <totalduration>31</totalduration>
	  <customer_price>0.0000</customer_price>
	  <reseller_price>0.0063</reseller_price>
	  <destination_id>1</destination_id>
	  <routingquality>1</routingquality>
	  <ipadress>62.220.170.21</ipadress>
	  <callstatus>ANSWER</callstatus>
	  <sip_useragent>AVM FRITZ!Box Fon WLAN 7270 v3</sip_useragent>
	  <prepaid_billed>0</prepaid_billed>
	</cdr_data>
	<cdr_data>
	  <date>2012-06-24</date>
	  <time>00:01:14</time>
	  <call_reference_id>012-001-001-060-111-025-292-014</call_reference_id>
	  <sip_account>4932229968552</sip_account>
	  <customer_id>18062</customer_id>
	  <customer_id_addon></customer_id_addon>
	  <a-number>4922232266</a-number>
	  <b-number>393355917093</b-number>
	  <billing_seconds>124</billing_seconds>
	  <callduration>124</callduration>
	  <totalduration>124</totalduration>
	  <customer_price>0.8122</customer_price>
	  <reseller_price>0.5677</reseller_price>
	  <destination_id>192</destination_id>
	  <routingquality>1</routingquality>
	  <ipadress>62.214.120.12</ipadress>
	  <callstatus>ANSWER</callstatus>
	  <sip_useragent>AVM FRITZ!Box Fon WLAN 7170 29</sip_useragent>
	  <prepaid_billed>0</prepaid_billed>
	</cdr_data>[/XML]
Wie ihr sehen könnt, fehlt das root-tag ! Ich bekomme die Datei aber genau so und wollte nun Fragen wie ich das anfangs root-tag und end root tag hinzufügen kann. Bzw. ob ich die blöcke zwischen den <cdr_data> tags einzeln auslesen kann und an einen Parser geben kann.
Mein Code sieht momentan so aus:

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

import javax.xml.parsers.*;

public class XMLReader
{
  public static void main( String[] argv )
  {
    
    try {
      // ---- Parse XML file ----
      DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
      DocumentBuilder        builder  = factory.newDocumentBuilder();
      Document               document = builder.parse( new File("/Users/max/Desktop/2012-06-24.xml") );
      
      
      // ---- Get list of nodes to given element tag name ----
      NodeList ndList = document.getElementsByTagName( "cdr_data");
      printNodesFromList( ndList );  // printNodesFromList see below
      // ---- Error handling ----
    } catch( SAXParseException spe ) {
        System.out.println( "\n** Parsing error, line " + spe.getLineNumber()
                                            + ", uri "  + spe.getSystemId() );
        System.out.println( "   " + spe.getMessage() );
        Exception e = ( spe.getException() != null ) ? spe.getException() : spe;
        e.printStackTrace();
    } catch( SAXException sxe ) {
        Exception e = ( sxe.getException() != null ) ? sxe.getException() : sxe;
        e.printStackTrace();
    } catch( ParserConfigurationException pce ) {
        pce.printStackTrace();
    } catch( IOException ioe ) {
        ioe.printStackTrace();
    }
  }

  public static void printNodeInfos( String sNodeName, Node node )
  {
	
      if( node.hasChildNodes() ) {
        NodeList nodeList = node.getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++){
        	Node node2 = nodeList.item(i);
        	if (node2.getNodeName().equals("sip_account")) {
        		System.out.println("sip_account = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("a-number")) {
        		System.out.println("quellnummer = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("b-number")) {
        		System.out.println("zielnummer = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("date")) {
        		System.out.println("datum = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("time")) {
        		System.out.println("uhrzeit = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("billing_seconds")) {
        		System.out.println("dauer = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("destination_id")) {
        		System.out.println("destID = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("customer_price")) {
        		System.out.println("endkundenVK = " + node2.getTextContent());
        	}
        	if (node2.getNodeName().equals("reseller_price")) {
        		System.out.println("resellerEK = " + node2.getTextContent());
        	}	
        }
      }
    
    System.out.println(    "----------------------\n" );
  }

  public static void printNodesFromList( NodeList ndList )
  {
    for( int i=0; i<ndList.getLength(); i++ )
      printNodeInfos( "ndList.item("+i+")", ndList.item(i) );
  }
}
```
Dieser funktioniert natürlich nur, wenn ich manuell in der .xml Datei die root-tags hinzufüge.
Hab bis jetzt bei google nichts passendes gefunden und hoffe ihr könnt mir helfen.

Danke
Max


----------



## faetzminator (11. Okt 2012)

Datei komplett einlesen
Vorne <someRootNode> dranhängen
Hinten </someRootNode> dranhängen
Datei komplett speichern

oder falls die Datei zu gross ist...

Neue Datei öffnen
<someRootNode> dranhängen
Teil für Teil in von der alten in die neue Datei kopieren
</someRootNode> dranhängen
Streams schliessen
Alte Datei löschen
Neue Datei umbenennen


----------



## Maxl (12. Okt 2012)

Das sagst du so leicht, was ich theoretisch machen muss ist mir klar ich weiß nur nicht wie Ichs umsetzen soll !! 

Meiner aktueller code wirft mir ja die Werte der if Einweisungen aus, kann man das irgendwie realisieren, dass aus diesen werten einen neue xml Datei entsteht die dann eben folgendermaßen aussieht ?
[XML]<root>
  <cdr_data>
     <sip_account>
     <date>
  </cdr_data>
<cdr_data>
     <sip_account>
     <date>
  </cdr_data>
  ...usw.
</root>[/XML]


----------



## Landei (12. Okt 2012)

Ich denke, die einfachste Möglichkeit in deinem Fall ist, den [c]DocumentBuilder[/c] nicht direkt die Datei parsen zu lassen, sondern einen [c]InputStream[/c]. In selbigen stopfst du erst einmal das [c]<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root>[/c], dann den Inhalt der Datei und am Ende dann das [c]</root>[/c].


----------



## Maxl (12. Okt 2012)

So ich realisiere das ganze jetzt anders ! Bekommen die Datei nun als *.csv Datei !!
Nun lese ich die Datei per BufferedReader ein und gebe sie mit System.out.println(); in der Konsole aus ! 

Ziel ist es allerdings die Daten in eine MYSQL Datenbank zu schreiben, die Datenbank und die Tabelle in welche die Daten kommen sind vorhanden und die Connection von Java zu der DB funktioniert auch.
Leider hab ich keinen blassen Schimmer, wie ich die Werte in die Tabelle in der Datenbank bekommen soll ?!
Ich brauche aus der .csv Datei jede Zeile und jeden wert !
Soll ich nun per Java eine DB erstellen oder die DB mit z.b MYSQL Workbench vorbereiten und die Daten rein schreiben, wenn ja wie sehen dazu die befehle aus ? ich steht komplett auf dem schlauch !

grüße


----------



## faetzminator (12. Okt 2012)

Und du bist jetzt echt der Meinung, dass wir noch 3x deine neuen Ideen in technische Lösungen umformulieren?
Erstens gibts Libs, die dir das lesen der CSV-Datei abnehmen und zweitens kannst du zwar die Daten einlesen, hast aber keine Ahnung wie die aufbereiten sollst? Was ist daran komplex? Hast du irgendwelche komplexen Datentypen?


----------



## Maxl (12. Okt 2012)

entschuldigen sie mich viel mal's, dass ich als java Anfänger noch nicht so die Ahnung habe und hier auf Hilfe hoffe !!
Ich werde es schon irgendwie anders lösen wenn ich nach einer 2. nachfrage gleich angeschnauzt werde !
besten dank für die zahlreichen Hilfen und vorallem an Landei der eine Hilfreiche Antwort gegeben hat und nicht meine frage als Antwort verwendet.


----------



## Landei (12. Okt 2012)

Das Zauberwort heißt JDBC: Galileo Computing :: Java ist auch eine Insel - 17 Einführung ins Datenbankmanagement mit JDBC


----------



## miasma (3. Nov 2012)

Das kanns ja wohl nicht sein... wie wäre bei der originalen nicht wohlgeformten "XML"-Datei folgender Ansatz wie hier auch schon beschrieben?


```
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Add a root-element to the sorted wikipedia-document.
 * 
 * @author Johannes Lichtenberger
 *
 */
public final class RootElemAddition {
	
	/** Wikipedia XML document -- output with root-element added. */
	private static final File WIKIPEDIA_DOC = new File(new StringBuilder(
			System.getProperty("user.home")).append(File.separator)
			.append("Desktop").append(File.separator)
			.append("wiki-articles-sorted.xml").toString());
	
	/**
	 * Main method.
	 * 
	 * @param args
	 *          args[0]: input file
	 * @throws IOException
	 * 				if an I/O error occured
	 */
	public static void main(final String[] args) throws IOException {
		final FileWriter writer = new FileWriter(WIKIPEDIA_DOC);
		writer
				.write("<mediawiki xmlns='http://www.mediawiki.org/xml/export-0.5/'>");
		final FileReader reader = new FileReader(args[0]);
		for (int c, i = 0; (c = reader.read()) != -1; i++) {
			writer.write(c);
			if (i % 1_000_000 == 0) {
				writer.flush();
			}
		}
		reader.close();
		writer.write("</mediawiki>");
		writer.flush();
		writer.close();
	}
}
```


----------

