phpbar.de logo

Mailinglisten-Archive

[php] Grosse XML Dateien mit PHP 5 verarbeiten

[php] Grosse XML Dateien mit PHP 5 verarbeiten

Ralf Eggert r.eggert at travello.de
Son Dez 4 15:38:16 CET 2005


Hallo Peter,

> was heißt groß? : 1 MB, 200 MB?

Die Datei ist ca. 39 MB gross, Tendenz steigend, und wird von einem
Partner angeliefert. D.h. ich habe keinen Einfluss auf die Struktur.

> Was heißt: lesend darauf zugreifen? : Wenige Daten herausfischen? Viele 
> Daten auslesen?

Ich möchte jeweils bestimmte Daten herausfischen und dann weiter
verarbeiten. Dafür wird es mehrere Schritte geben, die jeweils bestimmte
Bereiche der Struktur verarbeiten.

> Wie komplex ist die Datenstruktur?

Etwas vereinfacht sieht sie so aus:

<?xml version="1.0" encoding="ISO-8859-1"?>
<list date="2005-11-25 05:31:37" language="de" num="12168">
  <p id="2">
    <name>Hans</name>
    <address>Gartenstrasse 17</address>
    <geoID>1</geoID>
    <country>Deutschland</country>
    <images>
      <image num="1">
        <imageURL>http://www.domain.de/img/hans.jpg</imageURL>
        <thumbURL>http://www.domain.de/img/hans_t.jpg</thumbURL>
        <title>Bild von Hans</title>
      </image>
    </images>
  </p>
  <p id="4">
    <name>Peter</name>
    <address>Parkstrasse 198</address>
    <geoID>2</geoID>
    <country>Schweiz</country>
    <images>
      <image num="1">
        <imageURL>http://www.domain.de/img/peter.jpg</imageURL>
        <thumbURL>http://www.domain.de/img/peter_t.jpg</thumbURL>
        <title>Bild von Hans</title>
      </image>
    </images>
  </p>
</list>

Die Datei ist also nicht sonderlich tief verschachtelt, enthält aber z.B
12168 "p"-Elemente. Mein "vereinfacht" oben bedeutet, dass ich einige
Kindelemente herausgenommen habe, die alle ähnlich einfach strukturiert
sind.

> Sollen die Daten sofort verarbeitet werden, oder ist es möglich, die 
> XML-Datei "langsam" auszulesen und die benötigten Daten in ein 
> Zwischenformat (z.B. MySQL-Tabelle) zu bringen, und damit weiterzuarbeiten?

Meine Idee ist, zuerst die gesamte Datei zu durchlaufen und nur
bestimmte Elemente in einem Zwischenformat zu speichern. Dieses
Zwischenformat wird dann weiter verarbeitet.

> XSLT, je nachdem, was man vorhat.
> Als Vereinfachung von SAX meine Parser-Klasse: 
> http://www.media-palette.de/tools/xml-line/ (neue Version ist schneller)
> Wenn die Verarbeitung schnell gehen muss, würde ich einen speziellen 
> SAX-Parser schreiben, wie es im PHP-Manual gezeigt wird.

Eine schnelle Verarbeitung wäre schon wünschenswert. Welche Stelle im
PHP Manual meinst du genau? Diese hier:

http://www.php.net/manual/de/ref.xml.php

XMLReader soll sich ja besser für grosse XML Dateien eignen als SAX,
aber das $reader->read() ist ja sehr umständlich. Wenn ich nur

  <name>Hans</name>

lesen möchte, benötige ich alleine drei Mal ein $reader->read().

Und $reader->next() funktioniert bei der Datei nicht so richtig, weil er
erst das "list"-Element liest und bei $reader->next() dann fertig ist.
Schön wäre es, wenn ich von "p"-Element zu "p"-Element springen könnte.

Gruss,

Ralf

php::bar PHP Wiki   -   Listenarchive