XML Datei in JDBC speichern

kicmad00

Grünschnabel
Hallo!

Hat vielleicht jemand einen Tipp oder ein Beispiel mit der folgenden Problemstellung:

Ich lese eine XML Datei aus und möchte daraus eine Tabelle in meiner Datenbank anlegen bzw. die Tabelle erweitern.
Das alles soll natürlich für jede beliebige XML Datei funktionieren... voraussetzung ist nur, dass die Tabelle bereits angelegt ist.
Die Verbindung zur Datenbank besteht auch schon.

Vielleicht kann mir ja jemand helfen.

Danke schon im Voraus
 
Hallo!

Dann musst du wohl aus den Daten die du aus dem XML Dokument liest ein passendes create / alter table Statement zusammenbauen und absetzen.

Connection con = ...
Statement stmt = con.createStatement()
stmt.execute("CREATE TABLE FOO(id int....)");
stmt.close();

Gruß Tom
 
Danke einmal für die Antwort... nur leider hilft mir das nicht wirklich weiter.

Das Problem liegt bei dem Auslesen der Daten aus der XML-Datei.

Also z.B.

Code:
<?xml version="1.0" encoding="UTF-8"?>

<Wuensche>
  <Kind>
     <Vorname Geschlecht = "w">
        Julia
     </Vorname>
     <Wunsch>
        <Wunschbezeichnung>
            Lego 1000
         </Wunschbezeichnung>
         <Mindestpreis waehrung = "DM">
            20
          </Mindestpreis>
      </Wunsch>
      <Wunsch>
        <Wunschbezeichnung>
            Barbie Puppe
         </Wunschbezeichnung>
         <Mindestpreis waehrung = "dollar">
            40
          </Mindestpreis>
      </Wunsch>
	<Wunsch>
        <Wunschbezeichnung>
            Christbaum
         </Wunschbezeichnung>
         <Mindestpreis waehrung = "DM">
            40
          </Mindestpreis>
      </Wunsch>
     </Kind>
</Wuensche>

Jetzt will ich aus diesen Daten (sind nur ein Beispiel) eine halbwegs vernünftige Datenbank erstellen.

Hab eine fertige Klasse gefunden, allerdings funktioniert diese nicht bzw. ich weiß nicht wie ich mit dieser umgehen muss.

Vielleicht kann mir jemand dazu Tipps geben:

Code:
import java.io.*;
import java.sql.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import org.xml.sax.helpers.*;

/**
 *  Description of the Class
 *
 * @author     Danny Ayers
 * @created    24 February 2001
 */
public class XMLToJDBC extends DefaultHandler {

  String driver = "com.mysql.jdbc.Driver";
  String database = "jdbc:mysql://localhost/Maturavorbereitung";
  String user = "alle";
  String password = "abtedv";

  Connection conn = null;

  private boolean root;
 // private StringBuffer sql;
  private String table;

  public XMLToJDBC(String args[]) {
    table = args[1];
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(database, user, password);
      parse(args[0]);
      conn.close();

    } catch (Exception e) {
      e.printStackTrace();
    }

  }


  public void parse(String uri) {
    try {
      SAXParserFactory saxfactory = SAXParserFactory.newInstance();
      SAXParser saxparser = saxfactory.newSAXParser();
      XMLReader xmlreader = saxparser.getXMLReader();
    //  XMLReader xmlreader = (XMLReader)saxparser.getParser();
      xmlreader.setContentHandler(this);
      xmlreader.setErrorHandler(this);
      xmlreader.setFeature("http://xml.org/sax/features/validation", true);
      xmlreader.parse(uri);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }


  // DocumentHandler methods

  public void startDocument() {
    root = true;
    System.out.println("start document");
  }

  public void startElement(String uri, String local, String qname, Attributes attrs) {
    if (root) {
      root = false;
      return;
    }
    StringBuffer sql = new StringBuffer("INSERT INTO " + table + " (");
    int nfields = attrs.getLength();

    sql.append(attrs.getLocalName(0));
    for (int i = 1; i < nfields; i++) {
      sql.append(", " + attrs.getLocalName(i));
    }
    sql.append(") VALUES (");

    sql.append("'" + attrs.getValue(0) + "'");
    for (int i = 1; i < nfields; i++) {
      sql.append(", '" + attrs.getValue(i) + "'");
    }
    sql.append(")");

    System.out.println(sql);
    executeSQL(sql.toString());
  }

  public void characters(char ch[], int start, int length) {
  }


  public void endElement(String uri, String local, String qname) {
  }


  public void endDocument() {
    System.out.println("end document");

  }

  public void warning(SAXParseException e) {
    System.out.println("Warning : " + e);
  }

  public void error(SAXParseException e) {
    System.out.println("\nError : " + e);
  }

  public void fatalError(SAXParseException e) {
    System.out.println("\n\nFatal error : " + e);
  }

  public void executeSQL(String sqlstring) {
    try {
      Statement stmt = conn.createStatement();
      stmt.executeUpdate(sqlstring);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  public static void main(String args[]) {
    if (args.length != 2) {
      System.out.println("java XMLToJDBC [source] [table]");
      System.exit(1);
    }
    String[] argumente = new String[2];
    argumente[0] = "C:/Orte.xml";
    argumente[1] = "Ort";
    new XMLToJDBC(argumente);
  }
}
 
Hallo!

Wenn du nicht genau beschreibst was du willst bekommst du eben u.U. eine Antwort die dir nicht hilft... ;-)

Wenn du schon ein Datenbankschema hast, in das du die Daten aus dem XML File transportieren willst, dann brauchst du eigentlich nur ein Mapping zu definieren ( Welches Element kommt in welche Tabelle, welches Attribut in welche Spalte etc.)... danach kannst du wie gehabt über das ganze Dokument drüberlaufen und für jedes Element die entsprechende Aktion triggern.
Wenn du noch kein Schema hast wirds kompliziert. Dann müsstest du nämlich erstmal ein mapping definieren, welches festlegt, wie das XML Dokument auf die Datenbank abgeidlet werden soll. (Welches Element ist eine eigene Tabelle, welches nur eine Spalte etc.) wie sol der Fremdschlüssel bei 1:n bzw. die Zuordnungstabelle bei m:n Beziehungen lauten... wie ist der Name des Primärschlüssels und welche Typen bekommen die jeweiligen Spalten?...

Gruß Tom
 
Danke nochmals für dir Antwort.

Die Lösung mit Mapping ist bestimmt die bessere allerdings hatte ich keine Zeit mehr zur Verfügung. Hab das ganze jetzt auch anders gelöst.
Nicht ganz so elegant, jedoch erfüllt die Klasse ihren Zweck.
 
Zurück