XML Dateien in MySQL DB mit PHP

alloisxp

Mitglied
Hallo allerseits!

Ich habe eine Art XML Datenbank vor mir, sich beschreiben alle unterschiedliche Objekte des gleichen Typs.

Jetzt würde ich gerne die Informationen in bestimmten Tags auslesen und diese in meine MySQL Datenbank schreiben (indem ich die Dateien per Zählschleide durchlaufe und auslese).

So genau weiß ich aber nicht wie das geht.

Ich habe nach längerem recherchieren folgende Möglichkeit zum Parsen herausgefunden:

PHP:
<?php
// Umwandlungstabelle definieren
$tag_tabelle = array(
  "SECT1" => "P",
  "TITLE" => "B",
  "PARA" => "P"
);

// start_element() - wird vom XML-Parser bei öffnenden
// Tags aufgerufen
function start_element( $parser, $name, $attribute )
{
  // Umwandlungstabelle in den lokalen Scope holen
  global $tag_tabelle;

  // Testen, ob den aktuelle Tag in der Tabelle definiert ist
  if( isset( $tag_tabelle[ $name ] ) )
  {
    // öffnenden Tag ausgeben
    print "<" . $tag_tabelle[ $name ] . ">";
  }
}

// end_element() - wird vom XML-Parser bei schließenden
// Tags aufgerufen
function end_element( $parser, $name )
{
  // Umwandlungstabelle in den lokalen Scope holen
  global $tag_tabelle;

  // Testen, ob der aktuelle Tag in der Tabelle definiert ist
  if( isset( $tag_tabelle[ $name ] ) )
  {
    // Schließenden Tag ausgeben
    print "</" . $tag_tabelle[ $name ] . ">";
  }
}

// daten() - wird vom XML-Parser für CDATA-Bereiche aufgerufen
function daten( $parser, $data )
{
  // Datenbereich ausgeben
  print $data;
}

// Instanz des XML-Parsers erzeugen
$parser = xml_parser_create();

// Parameter des XML-Parsers setzen
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, true );

// Handler für Elemente ( öffnende / schließende Tags ) setzen
xml_set_element_handler( $parser, "start_element", "end_element" );
// Handler für Daten ( CDATA ) setzen
xml_set_character_data_handler( $parser, "daten" );

// Versuchen, die Datei zu öffnen
if (! ( $fp = fopen( "expat.xml", "r" ) ) )
{
  // Fehler -> Ausführung abbrechen
  die( "XML Fehler: Konnte Datei nicht öffnen." );
}

// Datei zeilenweise auslesen
while( $data = fread( $fp, 4096 ) )
{
  // Versuchen, die aktuelle Zeile zu parsen
  if( !xml_parse( $parser, $data, feof( $fp ) ) )
  {
    // Fehler -> Ausführung abbrechen
    die(  "XML Fehler: " .
          xml_error_string( xml_get_error_code( $parser ) ) .
          " in Zeile " .
          xml_get_current_line_number( $parser )
       );
  }
}

// Vom XML-Parser belegten Speicher freigeben
xml_parser_free( $parser );
?>

Also anscheinend kommt er irgendwie an die Daten der Tags.
Nur speichert er diese jetzt nicht in Variablen oder einem Array, sondern gibt diese direkt aus, was nicht mein Anliegen ist.

Außerdem enthält eine Zeile HTML und diese gibt er z.b. gar nicht aus.
(dies wäre allerdings zu vershcmerzen)

Mir geht es jetzt also eigentlich nur noch darum die Informationen NICHT zu parsen SONDERN in Variablen zu speichern.

Ich verfüge über die PHP Version 4.4.2 .
 
alloisxp hat gesagt.:
sondern gibt diese direkt aus
Wo?
alloisxp hat gesagt.:
Außerdem enthält eine Zeile HTML und diese gibt er z.b. gar nicht aus
Das ist fast klar. XML = HTML (nicht umgekehrt ;) ) wodurch er wahrscheinlich sämtliche Tags bis auf den daten (?) - Tag, dessen Information du haben willst, killt.
alloisxp hat gesagt.:
Mir geht es jetzt also eigentlich nur noch darum die Informationen NICHT zu parsen SONDERN in Variablen zu speichern.
Du willst parsen, glaub´s mir ;) und zusätzlich die Daten speichern.

[Vergiss das]
Kannst du mal nen Link schicken, woher du den Parser hast oder wie die xml_parse - Funktion genau aufgebaut ist (Code?).
[/Vergiss das]

http://de3.php.net/manual/en/function.xml-parse.php - da gibt es unter anderem schöne Anwendungsbeispiele. Vielleicht hilft es dir ja weiter.

Viel Erfolg
 
Zuletzt bearbeitet:
Danke für die Antwort :)
Ich habe allerdings noch ein bischen tiefenstudie betrieb den Vormittag und bin nun soweit das ich die XML Datei auslesen und theoretisch auch in die Datenbank packen kann.

Ich habe jetzt bloß noch ein Problem welches nicht mehr zum Threadtitel passt ABER ich will nicht extra nen neuen Thread eröffnen :)

Es geht darum das die XML dateien auf einem anderen Server liegen.
Es ist eine durchnummerierte Folge von Dateien die ich alle einlesen muss, leider jedoch nicht durchgehend durchnummeriert, es gibt Lücken. Und hier ist mein Problem:

Ich wollte eine Zählschleife ansetzen und quasi die Nummer des Namens immer erhöhen und mit is_file() oder file_exists() gucken ob es das File wirklich gibt, aber diese Funktionen kann man ja nicht für andere Server verwenden... was mich vor ein großes Problem stellt.
Die Dateien heißen alle e1 - e12000 und es gibt wie gesagt Lücken. Wie kriege ich sie denn von meinem Server aus alle eingelesen? :( Bin kurz vorm Verzweifeln.

Das zweite Problem wäre das ich ja eine Updatefunktion einbauen will, da das Modifizierungsdatum nicht in den Dateien steckt wollte ich über filemtime() die Zeit der letzten Modifikation der Datei auslesen, aber auch das geht nicht für entfernte Dateien... prima :(

Jemand ne Idee?
 
Ich kenn mich jetzt mit Datenzugriff auf Servern nicht so aus, aber sind in dem Directory in dem du suchst ausschließlich diese Dateien, oder auch andere? Sonst könntest du doch das Verzeichnis einfach durchgehen (while(file)).
Die XML - Dateien liegen komplett auf einem anderen Server, als das Skript? Kannst du ne ftp - Verbindung aufbauen? Falls ja: http://de3.php.net/manual/en/ref.ftp.php
Spontan war´s das jetzt mal von meiner Seite.
 
Zurück