Spider: XML -> MySQL -> PHP

Hallo,
auch nach langer Recherche finde ich leider keinen zufriedenstellenden Ansatz, so daß ich gern eure Meinung dazu hören möchte.

Die Ausgangslage:
Ich habe eine relativ große und tief verschachtelte XML Datei, deren Struktur und Inhalt ich in einer MySQL Datenbank speichern möchte. Jeder Wert und jedes Attribut der XML Datei soll in einem Datenfeld gespeichert werden. Es hadelt sich um etwa 300 verschiedene Einträge, die natürlich in bestimmten Zweigen mehrfach vorkommen können.

Mein Wunsch:
Alle Werte und Attribute sollen in ein PHP Objekt überführt werden können. Es sollen auch Teilobjekte möglich sein, d.h. ich möchte mir nur bestimmte Zweige ausgeben lassen.

Mein Ansatz:
Aus meiner Sicht läßt sich die XML Datei nicht direkt in die Datenbank importieren, sondern muß vorher einmal geparst werden um entweder die Datei so umzuschreiben, daß man sie über den MySQL XML Importer nutzen kann, oder man sie gleich in ein Objekt überführt. Nun wäre das Objekt nicht gerade klein und ein solches Objekt "von Hand" in PHP nachzubauen müßig. Die serialize / deserialize Funktionen von PHP scheinen mir in dieser Hinsicht auch nicht das Passende zu sein.

Meine Fragen:

  • wie importiert man die XML Daten am effektivsten in die Datenbank?
  • gibt es eine Möglichkeit die Daten direkt in ein PHP Objekt zu überführen?
  • wie würdet ihr das Problem angehen?

Gruß,
Spider

  1. Hallo,

    phps xml-Funktionalität kennst du (simplexml, dom, sax)?

    Gruß

    jobo

    1. Danke für deine schnelle Antwort Jobo,

      phps xml-Funktionalität kennst du (simplexml, dom, sax)?

      Ja, die lösen aber nicht das Problem, wie man die Daten in einem Rutsch in die Datenbank bekommt und wieder ausliest.

      Ich habe mir in dem Zusammenhang auch schon über Stored Procedures nachgedacht, aber auch denen kann man nicht einfach ein Objekt übergeben.

      Gruß,
      Spider

      1. Moin!

        phps xml-Funktionalität kennst du (simplexml, dom, sax)?

        Ja, die lösen aber nicht das Problem, wie man die Daten in einem Rutsch in die Datenbank bekommt und wieder ausliest.

        Ich habe mir in dem Zusammenhang auch schon über Stored Procedures nachgedacht, aber auch denen kann man nicht einfach ein Objekt übergeben.

        Das Problem ist, dass XML im allgemeinen eine Datenstruktur abbildet, die man nicht einfach so 1:1 in eine Datenbank tun kann.

        Klar könnte man die XML-Datei an ihren Hauptknoten der ersten Ebene auseinanderhacken und die Teilstrings dann als Text in eine Tabelle tun. Und mit XPath-Funktionen im Query dann suchen. Aber das kann man vermutlich auch deutlich einfacher haben, wenn man die Datenbank weglässt.

        Du wirst dein Problem also detaillierter beschreiben müssen.

        - Sven Rautenberg

  2. Hallo,

    ich habe fast tagtäglich mit der gleichen Aufgabenstellung zu tun zur Zeit. Je nachdem, wie groß dein XML-File ist, wirst du sowieso an eine Streaming-Lösung denken müssen. Ich arbeite mit Files zwischen 1 und 2 GB.

    D.h. lesen, verarbeiten, in DB schieben und so weiter. zwischendrin mal speicher leer machen. Dazu benutze ich den guten alten SAX-Parser.

    Ab einer gewissen Komplexität der Files wirst du um ein Nachbauen des Objektes nicht umherkommen, schon allein aufgrund von bestimmten Konvertierungen. So ist das zumindest bei mir. Datenmigration halt.

    Na ja,
    schönen Freitag noch, mein Bier wartet

    Grog

  3. Hi!

    Ich habe eine relativ große und tief verschachtelte XML Datei, deren Struktur und Inhalt ich in einer MySQL Datenbank speichern möchte.

    Gibt es weitere technische Anforderungen? Willst du sie einfach nur da drin haben oder auch die Datenbank-üblichen Funktionen darauf anwenden können, beispielsweise Suchen? Wenn nicht, würde ich sie einfach im Ganzen in ein Text/Blob-Feld ablegen. Ansonsten wüsste ich auch nichts besseres als die Daten auseinanderzunehmen und passend einzeln abzulegen.

    Lo!

    1. Moin,
      ich werde mal versuchen, alles zu beantworten.

      @dedlfix

      Gibt es weitere technische Anforderungen? Willst du sie einfach nur da drin haben oder auch die Datenbank-üblichen Funktionen darauf anwenden können, beispielsweise Suchen?

      Ja, ich muß darin suchen können. Das ist eine der zentralen Anforderungen. Ich muß z.B. alle Werte eines bestimmten Eintrages aller XML Dateien auslesen können.

      @Grog

      Je nachdem, wie groß dein XML-File ist, wirst du sowieso an eine Streaming-Lösung denken müssen

      So groß sind die Dateien nun auch wieder nicht, aber wie genau stellst du es an, daß die Datei in die DB gestreamt wird?

      Ab einer gewissen Komplexität der Files wirst du um ein Nachbauen des Objektes nicht umherkommen, schon allein aufgrund von bestimmten Konvertierungen.

      Und genau darum würd ich mich gern drücken. Vor allem, weil die Objektgröße sehr unterschiedlich sein kann. Damit meine ich, daß in der XML Datei alle 300 Werte gesetzt sein können, aber eben auch nur 10. Wäre eventuell so etwas wie Factory Method in diesem Zusammenhang denkbar?

      @Sven

      Das Problem ist, dass XML im allgemeinen eine Datenstruktur abbildet, die man nicht einfach so 1:1 in eine Datenbank tun kann.

      Das stimmt, doch die Abbildung der Datenstruktur in der Datenbank selbst besteht bereits. Bleibt also nur offen, wie füllt man die Tabellen am effektivsten und wie bekommt man die Daten in ein PHP Objekt?

      Vielen Dank für eure Hilfe,
      Spider