Ordner und Unterordner nach XML Datei durchsuchen

nchristoph

Erfahrenes Mitglied
Hallo,

ich will Ordner und deren Unterordner nach XML Dateien durchsuchen und diese dann mit SimpleXML öffnen.

Ich habe mir eine funktion zusammen gebaut, welche zwar den Hauptordner durchsucht, Unterordner krieg ich allerdings nicht geöffnet.

PHP:
function get_xml_files($_xml_dir,$_filename_regex){

    global $_dir_array, $_file_array;

    $_scan_dir = scandir($_xml_dir);
    foreach($_scan_dir as $_value){

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

Und So rufe ich die Funktion auf
PHP:
 $_start_dir = $_SERVER['DOCUMENT_ROOT'].'/modules';
 $_dir_array = array($_start_dir);
 $_file_array = array();

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

Mit var_dump($_dir_array) wird mir nur $_start_dir ausgegeben.

Wenn ich jetzt nach der While Schleife var_dump($_file_array) mache, kommt NULL.

Für mich heist das, das er keine Datei mir der xml Endung gefunden hat, weil er den Unterordner nicht durchsucht.

Was müsste ich an der Funktion verändern, das das funktioniert?

Kann mir da bitte wer helfen?

Grüsse
 
Hi

brauchst du das dir-Array später irgendwo?
Wenn nein, warum machst du das nicht einfach mit einer Rekursion?
Zurzeit ist das Ganze irgendwie umständlich und seltsam...
vor allem die ganze Parameter/Returnwertsache.

Ich schreibs mal um, wie ich mir das vorstellen würde...
 
Ich antworte jetzt mal nur auf den ersten Satz.

Du brauchst eine Funktion zum rekursiven Suchen, dh die Funktion sollte sich selber wieder aufrufen, wenn sie einen ordner findet.
Dann musst du nur eine geringfügige Modifikation dieser Funktion vornehmen; und zwar den Dateinamen mit zB strpos() nach .xml untersuchen. Wenn der Rückgabewert nicht false ist, kannst du weiterverarbeiten ;)
 
So, wieder da.

Ungetestet (und über das mit strpos noch gar nicht nachgedacht),
aber so irgendwie wärs Arraymäßig mal sinnvoller.
Mehrere globale Variablen für so eine Funktion sind doch wirklich nicht nötig...

Funktion:
PHP:
function get_recursive_files($_dir, $_filename_regex, $_result = array()) {
	$_scan_dir = scandir($_dir);
	foreach($_scan_dir as $_value) {
		if(!preg_match_all('/^\.+$/', $_value)) {
			if(is_dir($_dir.'/'.$_value))
				$_result = get_recursive_files($_dir.'/'.$_value, $_filename_regex, $_result);
			elseif(preg_match($_filename_regex, $_value))
				$_result[] = $_dir.'/'.$_value;
		}
	}
	return $_result;
}
Aufruf:
PHP:
$_file_array = get_recursive_files($_SERVER['DOCUMENT_ROOT'].'/modules', '/^[^\.]+\.xml$/');
Die zwei Strings hier kann man ja nach belieben in eigene Variablen stecken,
dann wird die Zeile wieder lesbarer.
 
Mal meine ungetestete Funktion (die Suchfunktion hab ich ausm Manual kopiert)

PHP:
<?php

function scanFileNameRecursivly($path = '', &$name = array() )
{
  $path = $path == ''? dirname(__FILE__) : $path;
  $lists = @scandir($path);
 
  if(!empty($lists))
  {
      foreach($lists as $f)
      {
   
		  if(is_dir($path.DIRECTORY_SEPARATOR.$f) && $f != ".." && $f != ".")
		  {
			  scanFileNameRecursivly($path.DIRECTORY_SEPARATOR.$f, &$name);
		  }
		  else if(strpos($f, '.xml') != false)
		  {
			  $name[] = $path.DIRECTORY_SEPARATOR.$f;
		  }
		  
      }
	  
  }
  return $name;
}

Usage
PHP:
<?php

$path = "/var/www/SimplejQueryDropdowns";
$file_names = scanFileNameRecursivly($path);

echo "<pre>";
var_dump($file_names);
echo "</pre>";

Wenn kein Pfad angegeben wird, wird der aktuelle verwendet.
 
So danke Sneel und alxy,

Ich werde mir mal beide anschauen.

Was ist der grösste unterschied der beiden? Die von alxy gepostete wird meiner vermutung nach schneller sein, da kein preg_match verwendet wird richtig?
 
Könnte/Wird so sein.
Der größte Unterschied...
ich hab deine Funktion in eine Rekursion gezwängt.
alxy hat eine eigene Funktion geschrieben :)
Ich denke, alxy ist damit vorzuziehen.
 
Ist sie nicht, denn sie beinhaltet einen Fehler ;-) Was passiert, wenn ich eine Datei mit dem Namen a.xml.txt habe?
Hallo,
diese Dateien könnte man über den MIME-Typ erfassen:
PHP:
$path = dirname(__FILE__);

$dirIterator = new RecursiveDirectoryIterator($path);
$itIterator = new RecursiveIteratorIterator($dirIterator,0);

foreach($itIterator as $it) {
	if(mime_content_type($it->getPathname()) == 'application/xml') {
		$xmlApplFiles[] = array($it->getPathname(), $it->getExtension());
	}
}

echo "<pre>"; 
var_dump($xmlApplFiles); 
echo "</pre>";
So werden auch Dateien mit der Erweiterung "xml", "xml.txt", "xsd", "xsl" usw. erfasst, so dass u.U. noch eine Selektion über die Dateierweiterung vorgenommen werden kann.
 

Neue Beiträge

Zurück