<root> node in bestehendes XML-File

Maxl

Mitglied
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:
Java:
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

Gesperrter Benutzer
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

Mitglied
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

Top Contributor
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

Mitglied
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

Gesperrter Benutzer
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

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

miasma

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

Java:
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();
	}
}
 

Ähnliche Java Themen

Neue Themen


Oben