Florian: von XML über XSLT zu SQL-Anweisungen?

Hallo,
ich beschäftige mich erst seit kurzem mit XML und bin daher noch ein wenig ratlos.
Ich würde gerne aus einer XML-Datei per XSLT-Stylesheet SQL-Anweisungen erzeugen, die die Tabellen meiner Datenbank erstellen und füllen.
...
<adressse>
   adr:row
    adr:description</adr:description>
adr:adressid</adr:adressid>
adr:anschrid</adr:anschrid>
adr:hausnummer</adr:hausnummer>
adr:postfach</adr:postfach>
   </adr:row>
</adressse>
...
Hieraus sollte dann z.B. eine Adresstabelle entstehen.
Bisher habe ich noch keinen Schimmer, wie ich das umsetzen kann (als xml-parser habe ich bisher xerces benutzt, die xslt-stylesheets sollten mit xalan verarbeitet werden, hat aber noch nicht funktioniert).
Vielleicht kann mir da ein XML-Meister ein paar Tipps geben.

  1. Hallo,

    ich beschäftige mich erst seit kurzem mit XML und bin daher noch ein wenig ratlos.

    wer nicht ;-)

    Ich würde gerne aus einer XML-Datei per XSLT-Stylesheet SQL-Anweisungen erzeugen, die die Tabellen meiner Datenbank erstellen und füllen.

    XSLT ist da wohl nicht die richtige Wahl, was du benötigst ist ein XML-Parser wie z.B. den von Dir erwähnten Xerces. Gesetzt den Fall, du nimmst die Java-Implementierung von Xerces, müsstest du dann ein Java-Programm schreiben, welches die XML-Datei parst und ein SQL-Statement zusammenbastelt. Dabei müsste dann z.B. der Name des Wurzelelements für den Tabellennamen herhalten und die Child-Element-Namen als Spaltennamen. Um das Ding gegen die Datenbank zu schicken, benötigst du dann eine Schnittstelle zur DB, im Java-Falle also JDBC.

    Bisher habe ich noch keinen Schimmer, wie ich das umsetzen kann (als xml-parser habe ich bisher xerces benutzt, die xslt-stylesheets sollten mit xalan verarbeitet werden, hat aber noch nicht funktioniert).

    WAS funktioniert denn nicht?

    Vielleicht kann mir da ein XML-Meister ein paar Tipps geben.

    hoffe es hilft,

    Franz, XML-Meister von Gottes Gnaden :))

    1. zunächst einmal:
      Vielen Dank für die Bemühungen. Ich hab' das allerdings im Mittelteil noch nicht ganz verstanden.

      XSLT ist da wohl nicht die richtige Wahl,

      wahrscheinlich habe ich das Prinzip von XSLT noch nicht ganz begriffen. Mein Plan war eigentlich zu meiner XML Datei ein passendes XSLT-Stylescheet zu erstellen, welches nach bestimmten Schlüsselwörtern ein SQL-Statement mit den Daten aus meiner XML-Datei erstellt.

      ...
      <adressse>
         adr:row
          adr:description</adr:description>
      adr:adressid</adr:adressid>
      adr:anschrid</adr:anschrid>
      adr:hausnummer</adr:hausnummer>
      adr:postfach</adr:postfach>
         </adr:row>
      </adressse>
      ...

      ich dachte, es wäre möglich aus dem oberen Ausschnitt mit Hilfe eines XSLT-Stylesheets folgendes(oder so ähnlich) erzeugen zu können, indem ich definiere, wie und wo meine XML-Elemente in einen String eingebaut werden.

      create table Adresse (AdressID INTEGER NOT NULL, AnschrID VARCHAR(50), Hausnummer VARCHAR(50), Postfach VARCHAR(30),PRIMARY KEY (AdressID));

      Gesetzt den Fall, du nimmst die Java-Implementierung von Xerces, müsstest du dann ein Java-Programm schreiben, welches die XML-Datei parst und ein SQL-Statement zusammenbastelt.

      ginge das nicht über ein XSLT-Stylesheet (z.B. mit Xalan?)

      Um das Ding gegen die Datenbank zu schicken, benötigst du dann eine Schnittstelle zur DB, im Java-Falle also JDBC.

      das ist noch ein weiter Weg...

      ...xml-parser habe ich bisher xerces benutzt, die xslt-stylesheets sollten mit xalan verarbeitet werden, hat aber noch nicht funktioniert).
      WAS funktioniert denn nicht?

      ich habe noch immer Probleme mit dem Parser, teste ihn aber gerade noch.

      Franz, XML-Meister von Gottes Gnaden :))

      <Florian wert="sehr erfreut">Vielen Dank</Florian>

      1. Hallo Florian,

        wahrscheinlich habe ich das Prinzip von XSLT noch nicht ganz begriffen. Mein Plan war eigentlich zu meiner XML Datei ein passendes XSLT-Stylescheet zu erstellen, welches nach bestimmten Schlüsselwörtern ein SQL-Statement mit den Daten aus meiner XML-Datei erstellt.

        XSLT ist dazu gedacht, aus einer XML-Datei einer bestimmten Struktur eine XML-Datei einer anderen Struktur zu generieren. In der Spec-Sprache: aus einem source-tree einen result-tree zu machen. Ein SQL-Statement passt da also nicht rein und briungt dir ja auch nix als Ausgabe eines XSLT-Stylesheet, solange du es nicht mit dem Stylesheet gegen die DB schicken kannst. Selbst wenn das irgendwie ginge wäre es doch um die Ecke gedacht und programmiert. Mit nem Parser ist das schnell erledigt aus der XML-Datei das SQL-Statement abzuleiten und dann auch gleich abzuschicken und das Ergebnis aus der DB weiterzuverarbeiten. Das geht ja auch nicht mit deinem Stylesheet. Also wenn ich nix grundsätzlich falsch verstehe bist du auf dem Holzweg.

        Gruß
        Franz

        1. wahrscheinlich habe ich das Prinzip von XSLT noch nicht ganz begriffen. Mein Plan war eigentlich zu meiner XML Datei ein passendes XSLT-Stylescheet zu erstellen, welches nach bestimmten Schlüsselwörtern ein SQL-Statement mit den Daten aus meiner XML-Datei erstellt.

          XSLT ist dazu gedacht, aus einer XML-Datei einer bestimmten Struktur eine XML-Datei einer anderen Struktur zu generieren. In der Spec-Sprache: aus einem source-tree einen result-tree zu machen.

          Richtig, das ist der interne prozess im XSLT Prozessor.

          Ein SQL-Statement passt da also nicht rein

          Das hingegen falsch.

          und briungt dir ja auch nix als Ausgabe eines XSLT-Stylesheet, solange du es nicht mit dem Stylesheet gegen die DB schicken kannst.

          Das nicht, aber das muss man auch nicht.

          Selbst wenn das irgendwie ginge wäre es doch um die Ecke gedacht und programmiert. Mit nem Parser ist das schnell erledigt aus der XML-Datei das SQL-Statement abzuleiten und dann auch gleich abzuschicken und das Ergebnis aus der DB weiterzuverarbeiten.

          Darüber kann man natürlich streiten.

          Im übrigen verweise ich auf XQL.

          1. Hallo,

            XSLT ist dazu gedacht, aus einer XML-Datei einer bestimmten Struktur eine XML-Datei einer anderen Struktur zu generieren. In der Spec-Sprache: aus einem source-tree einen result-tree zu machen.

            Richtig, das ist der interne prozess im XSLT Prozessor.

            Ein SQL-Statement passt da also nicht rein

            Das hingegen falsch.

            Naja, XSLT ist zumindest nicht in erster Linie dazu da, um  SQL-Statements zu generieren. Oder überspitzt, es ist eigentlich kompletter Blödsinn (außer man überzeugt mich vom Gegenteil‚;-)) XSLT zum Generieren von SQL-Statements zu benutzen.

            und briungt dir ja auch nix als Ausgabe eines XSLT-Stylesheet, solange du es nicht mit dem Stylesheet gegen die DB schicken kannst.

            Das nicht, aber das muss man auch nicht.

            Ja, theoretisch haste recht.

            Selbst wenn das irgendwie ginge wäre es doch um die Ecke gedacht und programmiert. Mit nem Parser ist das schnell erledigt aus der XML-Datei das SQL-Statement abzuleiten und dann auch gleich abzuschicken und das Ergebnis aus der DB weiterzuverarbeiten.

            Darüber kann man natürlich streiten.

            Ne, muss man gar nicht. Wir wissen ja gar nicht wozu Florian das Ganze eigentlich benötigt. Solange lohnt sich eigentlich nicht mal ne Diskussion

            Im übrigen verweise ich auf XQL.

            HM, das ist mir zu allgemein. XQL ist im Grunde nix anderes (soviel isses ja auch noch gar nicht ( s. http://www.w3.org/TandS/QL/QL98/pp/xql.html) als eine Erweiterung des XSLT-Pattern-Matching, also für die Suche in XML-Dokumenten geeignet. Mit SQL hat das erstmal nix zu tun, ausser mit der vagen Zukunftsvision, dass XML bald die DB ersetzt, oder so....

            Gruß
            Franz

            1. Hallo,

              Noch ein paar Worte vorweg: Ich bin Auszubildender und soll "mal kurz" eine Lösung finden, um die Daten, die unsere Datenbank füllen und die zur Zeit noch direkt in unseren Java-Klassen
              untergebracht sind, außerhalb (möglichst flexibel) zu halten.
              Dies sollte mit XML realisiert werden. Der Grund für meine unklare Ausdrucksweise ist, daß ich von allem schon ein wenig gehört (und viel gelesen) habe aber leider nur auf ein "solides" Halbwissen zurückgreifen kann und ziemlich im Dunkeln tappe.
              Tut mir leid, daß ich mich daher am Anfang nicht klar genug geäußert habe.

              Ich versuche es nochmal:
              Es geht also um die flexible Haltung der Daten für eine Datenbank, die die Grundlage unserer Servlets darstellt (Personendaten, Kundendaten, etc.)
              Zur Zeit sind die Daten noch in unseren JavaKlassen und müssen bei Veränderungen dort geändert werden (umständlich und unflexibel, wir befinden uns noch in der Entwicklung). Um dies zu verhindern, sollen die Daten in einem möglichst universellen Format abgelegt werden(XML). Die so ausgelagerten Daten sollen durch ein XSLT-Stylesheet
              in eine Datei umgewandelt werden, die nur noch aus entsprechenden SQL-Statemanets besteht (insert und update ,nicht create, da die Datenbank-Spezifikationen nicht noch hinzugefügt werden sollen - nur Daten). Eine JavaKLasse soll die Datei mit den SQL-Statements einlesen und dann die Datenbank mit den Daten füllen.

              Ein Vorteil dieser Methode ist, daß der Kunde durch Ändern der XML-Datei (oder durch Ändern der Datei mit den SQL-Anweisungen) seine
              Daten in der Datenbank aktualisieren kann. Spätere Sicherung der DatenbankDaten als XML-Datei wären möglich und für unterschiedliche Datenbanken müßten keine unterschiedliche Parser-Klassen geschrieben werden (wie beim direkten Parsen der XML-Datei)

              Das hingegen falsch.

              Naja, XSLT ist zumindest nicht in erster Linie dazu da, um  SQL-Statements zu generieren. Oder überspitzt, es ist eigentlich kompletter Blödsinn (außer man überzeugt mich vom Gegenteil‚;-)) XSLT zum Generieren von SQL-Statements zu benutzen.

              ich weiß nicht, ob das sehr überzeugend war

              und briungt dir ja auch nix als Ausgabe eines XSLT-Stylesheet, solange du es nicht mit dem Stylesheet gegen die DB schicken kannst.

              die generierte Datei soll von einer Java Klasse eingelesen werden, die dann nur noch die Statements der Datenbank übermittelt.

              Selbst wenn das irgendwie ginge wäre es doch um die Ecke gedacht und programmiert. Mit nem Parser ist das schnell erledigt aus der XML-Datei das SQL-Statement abzuleiten und dann auch gleich abzuschicken und das Ergebnis aus der DB weiterzuverarbeiten.

              das ist auch eine Möglichkeit, ich sollte mich allerdings mit der anderen Variante auseinandersetzen, damit alles so flexibel wie möglich bleibt

              »»Darüber kann man natürlich streiten.
              Ne, muss man gar nicht.

              doch, doch. Durch Eure Nachrichten ist mir meine Aufgabe schon viel klarer geworden. Vielen Dank! Ich hoffe nur, daß ich Euch nicht zu sehr genervt habe.

              Wir wissen ja gar nicht wozu Florian das Ganze eigentlich benötigt. Solange lohnt sich eigentlich nicht mal ne Diskussion

              Das stimmt, hätte mich auch gleich am Anfang klarer ausdrücken sollen. Dank an Euch, daß Ihr trotzdem geantwortet habt.

              Florian

              1. Hallo Florian,

                Noch ein paar Worte vorweg: Ich bin Auszubildender und soll "mal kurz" eine Lösung finden, um die Daten, die unsere Datenbank füllen und die zur Zeit noch direkt in unseren Java-Klassen
                untergebracht sind, außerhalb (möglichst flexibel) zu halten.
                Dies sollte mit XML realisiert werden. >

                Ok, verstanden ;-)

                Ich versuche es nochmal:
                Es geht also um die flexible Haltung der Daten für eine Datenbank, die die Grundlage unserer Servlets darstellt (Personendaten, Kundendaten, etc.)
                Zur Zeit sind die Daten noch in unseren JavaKlassen und müssen bei Veränderungen dort geändert werden (umständlich und unflexibel, wir befinden uns noch in der Entwicklung). Um dies zu verhindern, sollen die Daten in einem möglichst universellen Format abgelegt werden(XML).

                Bis hierhin nachvollziehbar.

                Die so ausgelagerten Daten sollen durch ein XSLT-Stylesheet
                in eine Datei umgewandelt werden, die nur noch aus entsprechenden SQL-Statemanets besteht (insert und update ,nicht create, da die Datenbank-Spezifikationen nicht noch hinzugefügt werden sollen - nur Daten). Eine JavaKLasse soll die Datei mit den SQL-Statements einlesen und dann die Datenbank mit den Daten füllen.

                Ein Vorteil dieser Methode ist, daß der Kunde durch Ändern der XML-Datei (oder durch Ändern der Datei mit den SQL-Anweisungen)

                seine Daten in der Datenbank aktualisieren kann. Spätere Sicherung der DatenbankDaten als XML-Datei wären möglich und für unterschiedliche Datenbanken müßten keine unterschiedliche Parser-Klassen geschrieben werden (wie beim direkten Parsen der XML-Datei)

                Das leuchtet mir schon nicht mehr ein. Wozu brauchst du eigene Parser-Klassen für eigene Datenbanken? Wenn du zum Parsen die Standardklassen der standardisierten DOM bzw. SAX nimmst, bist du parserunabhängig.

                Naja, aber da wird sich schon einer was gedact haben bei Euch, was ich gar nicht überblicke.

                Naja, XSLT ist zumindest nicht in erster Linie dazu da, um  SQL-Statements zu generieren. Oder überspitzt, es ist eigentlich kompletter Blödsinn (außer man überzeugt mich vom Gegenteil‚;-)) XSLT zum Generieren von SQL-Statements zu benutzen.

                ich weiß nicht, ob das sehr überzeugend war

                für mich schon ;-)

                die generierte Datei soll von einer Java Klasse eingelesen werden, die dann nur noch die Statements der Datenbank übermittelt.

                ja, aber warum nicht gleich das Statement aus der XML-Datei generieren und losschicken. Weil der Kunde nochmal etwas ändern können soll, was automatisch generiert wird? Naja, why not.

                Selbst wenn das irgendwie ginge wäre es doch um die Ecke gedacht und programmiert. Mit nem Parser ist das schnell erledigt aus der XML-Datei das SQL-Statement abzuleiten und dann auch gleich abzuschicken und das Ergebnis aus der DB weiterzuverarbeiten.

                das ist auch eine Möglichkeit, ich sollte mich allerdings mit der anderen Variante auseinandersetzen, damit alles so flexibel wie möglich bleibt

                wenn du auch in der Zwischenstufe noch eine Änderungsmöglichkeit durch den Kunden brauchst (warum auch immer), dann baruchst du natürlich die Datei. Aber auch die würde ich dann nicht mit Stylesheets erzeugen, sondern mit Java.

                »»Darüber kann man natürlich streiten.
                Ne, muss man gar nicht.

                doch, doch. Durch Eure Nachrichten ist mir meine Aufgabe schon viel klarer geworden. Vielen Dank! Ich hoffe nur, daß ich Euch nicht zu sehr genervt habe.

                ne gar nicht, is richtig interessant, mal was Konzeptionelles. Da kann man immer was bei lernen

                Das stimmt, hätte mich auch gleich am Anfang klarer ausdrücken sollen.

                Naja, unklar wars ja nur, weil der Kontext nicht mitkam.

                Gruß
                Franz

          2. Hallo Björn!

            Ein SQL-Statement passt da also nicht rein

            Das hingegen falsch.

            Das ist hingegen deiner Meinug richtig.

            auch wenn er mit XSLT irgendwas erzugt, das es so aussieht wie Datenbankeinträge (klar kann er das machen), sind diese keine. Dazu muss er sie auch in die DB schreiben. Das macht ihm aber kein XSL-Prozessor.
            Er kann aus der XML-Datei eine andere XML-Datei erstellen und diese dann in die DB einlesen: aber wozu 2 Fach programmieren?

            Darüber kann man natürlich streiten.

            Stimmt. In ein oder zwei Jahren.

            Im übrigen verweise ich auf XQL.

            Der WD vom 15 Aug. hilft ihm ungemein.
            Wenn er Lust/Zeit hat, dann kann er sich den SQL-Server 7 (SQL Server 2000) anschauen (http://www.microsoft.com/sql/)diese hat eine eingebaute XML Support.
            Oder er schaut sich mal beim Oracle um (http://technet.oracle.com/tech/xml/)
            Sie haben sehr gute Seiten was SQL und XML angeht.

            Grüße
            Thomas

      2. ich dachte, es wäre möglich aus dem oberen Ausschnitt mit Hilfe eines XSLT-Stylesheets folgendes(oder so ähnlich) erzeugen zu können, indem ich definiere, wie und wo meine XML-Elemente in einen String eingebaut werden.

        create table Adresse (AdressID INTEGER NOT NULL, AnschrID VARCHAR(50), Hausnummer VARCHAR(50), Postfach VARCHAR(30),PRIMARY KEY (AdressID));

        Das geht auch. Wo hast du Probleme?

        1. Hallo Björn!

          Wo hast du Probleme?

          Bei deiner Aussage?

          Grüße
          Thomas