Ordner nach XML durchsuchen und einlesen mit SimpleXML

Cluster

Mitglied
Hallo zusammen :)

also ich würde gerne einen Ordner incl aller Unterordner nach einem bestimmten Dateitypen durchsuchen lassen und dann mit SimpleXML einlesen in eine DB.
Momentan bin ich soweit das ich mit SimpleXML nur einen bestimmten Ordner und eine bestimmte XML einlesen kann.

PHP:
/*xml open*/
$content = simplexml_load_file('xml_ordner/datei.xml');

/*get content*/
$id = $content->id;

/*action after confirm*/
if (isset( $_POST['eintragen'] ))
{
        	mysql_query("INSERT INTO db (id)
                				VALUES ('$id');

/*If the database has been updated*/
if(mysql_affected_rows() > 0)
{
  echo "Daten wurden eingetragen!!<br /><br />";
}
else
{
  echo "Daten wurden nicht eingetragen!!<br /><br />";
}

}

Nur wie bewege ich nun SimpleXML dazu in allen Ordnern und Unterordnern nach datei.xml zu suchen da ich eine Ordnerstrucktur habe mit einem Hauptordner und 3 Unterordner welche 3 verschieden benannten XML (z.B: datei1.xml, datei2.xml, datei3.xml) enthalten.

grüße
 
Zuletzt bearbeitet:
Mti SimpleXML wirst Du wohl keine Ordner nach XML-Dateien durchsuchen können.

Ich weiss nicht, ob es in PHP dazu bereits eine fertige Funktion gibt. Wenn nicht, würde ich das in etwa so machen (ungetestet):

PHP:
<?php

  function get_files($_dir,$_filename_regex){
    
    global $_dir_array, $_file_array;
    
    $_scan = scandir($_dir);
    foreach($_scan as $_value){
    
      if(is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
      elseif(preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
    
    }
  
  }
  
  
  $_start_dir = 'pfad/zum/ordner';
  $_dir_array = array($_start_dir);
  $_file_array = array();

  foreach($_dir_array as $_dir) get_files($_dir,'/^[^\.]+\.xml$/');

?>

Die gefundenen XML-Dateipfade befinden sich anschliessend alle in der Varible $_file_array.
 
Zuletzt bearbeitet:
Hier der korrigierte Code (dieses mal getestet ;)):

PHP:
<?php

  function get_files($_dir,$_filename_regex){

    global $_dir_array, $_file_array;

    $_scan = scandir($_dir);
    foreach($_scan as $_value){

      if(!preg_match('/^\.+$/',$_value)){
        if(is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
        elseif(preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
      }

    }

  }


  $_start_dir = 'pfad/zum/ordner';
  $_dir_array = array($_start_dir);
  $_file_array = array();
  
  while(count($_dir_array) > 0) get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/');
  print_r($_file_array);

?>
 
Zuletzt bearbeitet:
Sehr geile Sache muss ich mich mal reinlesen was genau da alles passiert ::)
Bin noch absoluter php-neuling und würde nähmlich gerne die XML`s an eine DB übergeben, mit einer gings bisher einwandfrei nun kommt also das nächste "Kapitel" im Lehrbuch mit dem Zugriff auf Arrays und der Ein und Ausgabe über MySQL, vielen Dank :)

Muss ich nun also anhand des Indexes des Array über den Pfad in der XML wie gehabt dann auf die entsprechenden Werte zugreifen?

Bei einer einzelnen mache ich das ja in etwa so:

PHP:
$title = $batch->items->item->title;

währe das dann z.b. für eine Xml aus dem Array etwa so?

PHP:
echo $title = $batch->items->item->title[1];
 
Zuletzt bearbeitet:
währe das dann z.b. für eine Xml aus dem Array etwa so?

PHP:
echo $title = $batch->items->item->title[1];

Nein. Die XML-Dateien arbeitest Du am besten nach der while-Schleife mit foreach ab. So werden alle XML-Dateien einzeln nacheinander geöffnet.

PHP:
...

while(count($_dir_array) > 0) get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/');

foreach($_file_array as $_file){

    /*xml open*/
    $content = simplexml_load_file($_file);

    /*get content*/
    $id = $content->id;

   ...

}

...

Ach ja:

PHP:
mysql_query("INSERT INTO db (id) VALUES ('$id');

Das schliessende Anführungszeichen am Ende der Zeile (vor dem Semikolon) nicht vergessen.
 
Zuletzt bearbeitet:
Alos ich habs so probiert mit deinem Code:

PHP:
  function get_files($_dir,$_filename_regex){

    global $_dir_array, $_file_array;

    $_scan = scandir($_dir);
    foreach($_scan as $_value){

      if(!preg_match('/^\.+$/',$_value)){
        if(is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
        elseif(preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
      }

    }

  }


  $_start_dir = 'xml_video/';
  $_dir_array = array($_start_dir);
  $_file_array = array();
  
while(count($_dir_array) > 0) get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/'); 


foreach($_file_array as $file){
$content_batch = simplexml_load_file($file);


/*get content*/
$con_id = $content["id"];
$email =  $content->email["address"];
$title = $content->title;
$dvd = $content->value;
$aspects = $content->aspects->aspect;

    for($i = 0; $i < 30; $i++)
    {
      $arr2[] = $aspects[$i];
    }
    $data = implode(":", $arr2);


}
/*action after confirm*/
if (isset( $_POST['eintragen'] ))
{
 

        	mysql_query("INSERT INTO db (con_id,email,title,dvd,aspects,added)
                				VALUES ('$con_id','$email','$title','$dvd','$data',NOW())");

/*If the database has been updated*/
if(mysql_affected_rows() > 0)
{
  echo "Daten wurden eingetragen!!<br /><br />";
}
else
{
  echo "Daten wurden nicht eingetragen!!<br /><br />";
}


header("Refresh: 0; url=index.php");

}

jedoch werden mir dann keine Daten mehr ausgegeben, kann es sein das es eine Rolle spielt wenn die XML`s unterschiedliche Attribute haben und Objekte das es dann nicht geht?
aspects[] ist eine Liste von Feldern die alle apsects heissen aber unterschiedliche Werte haben evtl macht das auch die Probleme?

grüße und vielen Dank für eure Hilfe :)

edit:

wobei mit

PHP:
  print_r($_file_array);

bekomme ich das array der files zurück.

mit

PHP:
$content_batch = simplexml_load_file(pfad);

kann ich aber einwandfrei auf alles in der xml zugreifen und speichern.
 
Zuletzt bearbeitet:
Funktioniert schon recht gut aber es gibt da ein paar Sachen die ich so nicht herrausfinden kann irgendwie :)
Also ich würde gerne alle Daten aus den XMLs aus dem jeweiligen Hauptordner in einen DB Eintrag bekommen da diese immer zusammen gehören vom Inhalt her, die Schleife versucht jedoch jede XML in einen einzelnen DB Eintrag zu bekommen.
Die Felder und Abfragen für alle Elemente in den XML`s hab ich so hinbekommen nur nicht das auch alle daten dann nur einer ID in der Datenbank zugeordnet werden.

vielen Dank für deine Hilfe alleine würd ich das wohl nie gebacken bekommen :(
 
Zuletzt bearbeitet:
Zurück