venty: XML-Datei mit PHP zeilenweise auslesen

Hallo liebe Community!

Ich versuche gerade eine große XML-Datei (250MB) auszulesen und in die MySQL-DB zu bringen. Leider habe ich dabei ein kleines Speicherproblem. Deswegen würde ich gerne wissen ob es auch die Möglichkeit gibt das ganze Zeilenweise anzugehen.

Derzeit arbeite ich mit SimpleXMLElement.

$xml = new SimpleXMLElement($path_to_xml, null, true);  
foreach ($xml->children() as $cruise) {  
echo "<pre>";  
print_r($cruise);  
echo "</pre>";  
}

Wie gehe ich am besten vor?

Danke für die Hilfe :)

  1. Hi!

    Ich versuche gerade eine große XML-Datei (250MB) auszulesen und in die MySQL-DB zu bringen. Leider habe ich dabei ein kleines Speicherproblem. Deswegen würde ich gerne wissen ob es auch die Möglichkeit gibt das ganze Zeilenweise anzugehen.
    Derzeit arbeite ich mit SimpleXMLElement.

    Nicht mit SimpleXML, denn damit eine Struktur erstellt werden kann, die dem Dokument entspricht, muss schon das Gegenstück zum öffnenden Root-Element gefunden werdn und das ist naturgemäß am Ende der in deinem Fall 250 MB.

    Zeilenweise ist bei XML eine noch schlechtere Idee als es bei CSV ist.

    Wie gehe ich am besten vor?

    Du könntest einen Import direkt mit den Tools von MySQL probieren. Ansonsten bleibt wohl nur das Einlesen mit dem XML-Parser von PHP.

    Lo!

    1. Du könntest einen Import direkt mit den Tools von MySQL probieren. Ansonsten bleibt wohl nur das Einlesen mit dem XML-Parser von PHP.

      Leider hat nicht jede XML-Die ich in diese DB bringen muss die selbe struktur. Das macht aber nichts denn bei den kleinen konnte ich das immer mit SimpleXMLElement machen. Ich werde also auf den XML-Parser zurückgreifen müßen.

      Soweit so gut, nur wie bekomme ich dann die eingelesenen Werte von der XML-Datei zurück. Wird dort nicht erklärt.

      MfG

      1. Hi,

        Soweit so gut, nur wie bekomme ich dann die eingelesenen Werte von der XML-Datei zurück. Wird dort nicht erklärt.

        Du wirst dich schon etwas intensiver damit *beschäftigen* müssen, wenn du diese Möglichkeit nutzen willst!
        Deine Antwort klingt gerade wie „da ist kein Beispiel, das ich per Copy&Paste übernehmen kann - also was soll ich mit dem Scheiß?“

        Wenn du diesen Parser, den dedlfix dir verlinkt hat, nur nutzen würdest, um nach wie vor das XML „in einem“ zu parsen, wirst du damit in Punkto Speicherverbrauch vermutlich keinen nennenswerten Unterschied feststellen.

        Der Vorteil des Parsers ist, dass er Event-basiert arbeiten kann - du bestimmst, was beim Auftreten der Start-/End-Tags bestimmter Elemente (oder vergleichbaren signifikanten Ereignissen) passieren soll, wie diese verarbeitet werden sollen.
        Dadurch kannst du „während“ des Einlesens die Daten auf Elementebene verarbeiten, statt wie bei einem herkömmlichen Parser das komplette aus dem XML erstellte DOM im Speicher halten zu müssen.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Abend :)

          Du wirst dich schon etwas intensiver damit *beschäftigen* müssen, wenn du diese Möglichkeit nutzen willst!
          Deine Antwort klingt gerade wie „da ist kein Beispiel, das ich per Copy&Paste übernehmen kann - also was soll ich mit dem Scheiß?“

          Lol, keine Sorge so primitiv geh ich nicht vor. Was ich nicht verstehe kommt nicht in meinen code :)

          Wenn du diesen Parser, den dedlfix dir verlinkt hat, nur nutzen würdest, um nach wie vor das XML „in einem“ zu parsen, wirst du damit in Punkto Speicherverbrauch vermutlich keinen nennenswerten Unterschied feststellen.

          Der Vorteil des Parsers ist, dass er Event-basiert arbeiten kann - du bestimmst, was beim Auftreten der Start-/End-Tags bestimmter Elemente (oder vergleichbaren signifikanten Ereignissen) passieren soll, wie diese verarbeitet werden sollen.
          Dadurch kannst du „während“ des Einlesens die Daten auf Elementebene verarbeiten.

          Genau das möchte ich. Ich glaube ich hab auch schon gefunden wie/wo. Nämlich in der content funktion (im beispiel von php.net), für alle die die selbe frage haben.

          Meine frage ob das ganze auch in einer classe die benötigten funktionen findet ist aber noch nicht beantwortet.

          Habe jetzt die funktionen startElement endElement und content. Ich bekomme aber grad keine Ausgabe. Deswegen wäre es gut zu wissen ob es dadran liegt.

          MfG

          1. Abend

            Habe jetzt die funktionen startElement endElement und content. Ich bekomme aber grad keine Ausgabe. Deswegen wäre es gut zu wissen ob es dadran liegt.

            Ich weiß jetzt woran es liegt. Laut error.log vom Apache ist auf Zeile 39 versucht worden etwas zu öffnen das zu groß ist. Hmmm... auf der Zeile hab ich das hier stehen.

            while ($data = fread($fp, filesize($file))) {

            Ich dachte fread ließt Zeilenweise?

            MfG

            1. while ($data = fread($fp, filesize($file))) {

              Ich dachte fread ließt Zeilenweise?

              Natürlich nicht wenn ich ihn die ganze datei einlesen lasse :S

          2. Hi,

            Meine frage ob das ganze auch in einer classe die benötigten funktionen findet ist aber noch nicht beantwortet.

            Die Beschreibung von bspw. xml_set_element_handler verlinkt das Stichwort callback in der Parameterliste mit einer Erklärung, wie diese angegeben werden können.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Die Beschreibung von bspw. xml_set_element_handler verlinkt das Stichwort callback in der Parameterliste mit einer Erklärung, wie diese angegeben werden können.

              Genau das hat gefehlt :)

              danke für die Hilfe!

    2. Kann man die Funktionen startElement und endElement schon auch in einer klasse definieren oder?

      MfG