1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
1119
1119
EMPFEHLEN
-
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.
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.PHP-Code:/*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 />";
}
}
grüßeGeändert von Cluster (02.09.09 um 12:51 Uhr)
-
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):
Die gefundenen XML-Dateipfade befinden sich anschliessend alle in der Varible $_file_array.PHP-Code:<?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$/');
?>Geändert von xanthos (02.09.09 um 13:40 Uhr)
-
leider bekomme ich hier mit
print_r($file_array);
nichts ausgegeben aber der Pfad zum Ordner stimmt eigentlich.
-
Hier der korrigierte Code (dieses mal getestet
):
PHP-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 = '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);
?>Geändert von xanthos (03.09.09 um 18:03 Uhr)
-
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:
währe das dann z.b. für eine Xml aus dem Array etwa so?PHP-Code:$title = $batch->items->item->title;
PHP-Code:echo $title = $batch->items->item->title[1];
Geändert von Cluster (03.09.09 um 17:57 Uhr)
-
03.09.09 17:56 #6
Noch einfacher würde es übrigens mit glob() gehen.
KIDS Kinderbetreuungsdienst
Xing
"When you play the game of thrones, you win or you die. There is no middle ground."
by Cersei Lannister in "A Game Of Thrones"
-
Nein. Die XML-Dateien arbeitest Du am besten nach der while-Schleife mit foreach ab. So werden alle XML-Dateien einzeln nacheinander geöffnet.
Ach ja:PHP-Code:...
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;
...
}
...
Das schliessende Anführungszeichen am Ende der Zeile (vor dem Semikolon) nicht vergessen.PHP-Code:mysql_query("INSERT INTO db (id) VALUES ('$id');
Geändert von xanthos (03.09.09 um 18:21 Uhr)
-
Alos ich habs so probiert mit deinem Code:
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?PHP-Code: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");
}
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
bekomme ich das array der files zurück.PHP-Code:print_r($_file_array);
mit
kann ich aber einwandfrei auf alles in der xml zugreifen und speichern.PHP-Code:$content_batch = simplexml_load_file(pfad);
Geändert von Cluster (03.09.09 um 22:40 Uhr)
-
Naja, die MySQL-Anweisung muss natürlich auch in die foreach-Schleife. Sonst wird nur die letzte XML-Datei eingetragen.
-
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
Geändert von Cluster (04.09.09 um 14:40 Uhr)
-
Wenn Du den Inhalt aller XML-Dateien in einen einzigen DB-Eintrag speichern willst, musst Du die Daten zuerst sammeln (z.B. in einem Array). Mit implode() kannst Du anschliessend die einzelnen Array-Elemente verknüpfen.
PHP-Code: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;
}
}
}
/*action after confirm*/
if(isset($_POST['eintragen'])){
// XML-Dateien suchen
$_start_dir = 'xml_video/';
$_dir_array = array($_start_dir);
$_file_array = array();
while(count($_dir_array) > 0) get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/');
// XML-Dateien einlesen
$con_id = array();
$email = array();
$title = array();
$dvd = array();
$data = array();
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;
$arr2 = array();
$aspects = $content->aspects->aspect;
for($i = 0; $i < 30; $i++) $arr2[] = $aspects[$i];
$data[] = implode(":", $arr2);
}
/*If the database has been updated*/
$_sql = "INSERT INTO db (con_id,email,title,dvd,aspects,added)
VALUES ('".implode('',$con_id)."','".implode('',$email)."',
'".implode('',$title)."','".implode('',$dvd)."',
'".implode('',$data)."',NOW())";
if(mysql_query($_sql))
echo "Daten wurden eingetragen!!<br /><br />";
else
echo "Daten wurden nicht eingetragen!!<br /><br />";
header("Refresh: 0; url=index.php");
}
-
Also habs nun soweit das es halbwegs funktioniert jedoch werden nur die XML`s übernommen mit dem Index 0 und 2, das mit dem Index 1 leider nicht.
Ordnerstruktur schaut etwa so aus:
Hauptordner/XML[0] und XML[1]
Hauptordner/Unterordner/XML[2]
Kann es sein das die Funktion nach dem finden einer XML direkt in den nächsten Ordner springt?
EDIT: so habs mal umständlich gelöst aber egal nun gehts
musste leider rein da die function sonst alles durcheinander gewürfelt hatte.PHP-Code:
$xml = simplexml_load_file($_file_array[0]);
$xml1 = simplexml_load_file($_file_array[1]);
$xml2 = simplexml_load_file($_file_array[2]);
Vielen Dank für die DenkanstößeGeändert von Cluster (07.09.09 um 12:53 Uhr)
Ähnliche Themen
-
XML durchsuchen -> simplexml
Von webbudda im Forum PHPAntworten: 8Letzter Beitrag: 30.10.09, 01:38 -
XML einlesen mit SimpleXML
Von mcready im Forum PHPAntworten: 2Letzter Beitrag: 19.01.09, 16:16 -
XML einlesen (SimpleXMl) von meheren gleichen Tags
Von Primus852 im Forum PHPAntworten: 2Letzter Beitrag: 31.10.08, 16:20 -
Ordner nach neuen Bildern durchsuchen und in Tabelle ausgeben
Von ATdrag0N im Forum PHPAntworten: 6Letzter Beitrag: 06.05.08, 09:45 -
Ordner nach Dateien durchsuchen lassen?
Von heikoarndt im Forum .NET ArchivAntworten: 2Letzter Beitrag: 23.03.04, 12:47





Zitieren


Login






[PHP][Snippet] Array zu XML konvertieren