simpleXML, Ordnerstruktur, PHP-Logik Problem, Kategoriesierung

BrainLight

Mitglied
Hallo liebe Community!

Nach durchforsten sämtlicher "Ordner auslesen" Threads muss ich nun leider doch einen erstellen, denn Ich habe nicht wirklich etwas zu meinem Problem finden können.

Ich hoffe Ihr könnt mir trotz des ganzen WM-Wahns ein bißchen unter die Arme greifen.
Da mir nach dem verkorksten Deutschlandspiel die Nerven blank liegen, mache ich es kurz und schmerzlos:

Mein Ziel ist es, aus einem Ordner mit Unterverzeichnissen ein gegliedertes XML zu erstellen.
Dabei soll jedes Unterverzeichnis eine Kategorie darstellen, in der die beinhalteten Daten benannt werden.

Mein folgendes Script liefert zwar Daten, aber leider nur die im "image"-Ordner:

PHP:
<?php

$path_to_image_dir = 'images';

$xml_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<images>
</images>
XML;

$xml_generator = new SimpleXMLElement($xml_string);

if ($handle = opendir($path_to_image_dir)) 
{
	while (false !== ($file = readdir($handle)))
	{
	if (is_dir($path_to_image_dir.'/'.$file))
	{
		if($file !="." && $file !="..")
		{
			list() = $file;
			$category = $xml_generator->addChild('category');
			$category->addAttribute('name', $file);
			if(is_file($file))
			{
				list() = $file;
				$image = $category->addChild('image');
				$image->addChild('path', $path_to_image_dir.'/'.$file);
				$image->addChild('height', $height);
				$image->addChild('width', $width);
			}
		}
	}
	else
	{
		if (is_file($path_to_image_dir.'/'.$file))
		{
			list($width, $height) = getimagesize($path_to_image_dir.'/'.$file);				
			$image = $xml_generator->addChild('image');
			$image->addChild('path', $path_to_image_dir.'/'.$file);
			$image->addChild('height', $height);
			$image->addChild('width', $width);
		}
	} 
		
	}
	closedir($handle);
}
$file = fopen('images.xml','w');
fwrite($file, $xml_generator->asXML());
fclose($file);
?>

Btte habt nachsehen mit dem Script, denn ich bin schon eine Weile dran und habe so einiges mit den Funktionen is_dir und is_file experimentiert.
Es wäre wirklich schön, wenn mir einer einen hilfreichen Ansatz geben könnte, um die Unterordner ordentlich auszulesen...

Habt Dank im Vorraus und

MfG
BL
 
Hallo,

wenn du es inkl. Unterordner machen willst, solltest du einen rekursiven Ansatz wählen. Ungetestet, aber das wäre der Ansatz:

PHP:
<?php
$path_to_image_dir = 'images';

$xml_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<images>
</images>
XML;

$xml_generator = new SimpleXMLElement($xml_string);

/**
 * Suche Bild-Dateien oder Ordner.
 * Wenn Ordner gefunden, für Suche im Ordner aus [rekursiv]
 * 
 * @param string $path - Pfad, der durchsucht werden soll
 */
function searchImagesRecursive($path)
{
    // Ordner-Handle holen
    $handle = opendir($path);
    
    // Nächsten Verzeichnis-Eintrag lesen
    while($file = readdir($handle))
    {
        // Absoluten Pfad zusammen bauen
        $entry = $path . '/' . $file;
        
        // Prüfen auf Typ Ordner
        if(is_dir($entry) && $file != '.' && $file != '..')
        {
            // Es ist ein Ordner, führe Suche in Unterordner aus
            searchImagesRecursive($entry);
        }
        elseif(is_file($entry))
        {
            // Es ist eine Datei
            if($imginfo = getimagesize($entry))
            {
                // Es ist ein Bild
                list($width, $height) = $imginfo;
                
                // Hier die XML-Definitionen für Dateien
            }
        }
    }
    
    // Handle schließen
    closedir($handle);
}

/*
if ($handle = opendir($path_to_image_dir))
{
    while (false !== ($file = readdir($handle)))
    {
        if (is_dir($path_to_image_dir.'/'.$file))
        {
            if($file !="." && $file !="..")
            {
                list() = $file;
                $category = $xml_generator->addChild('category');
                $category->addAttribute('name', $file);
                if(is_file($file))
                {
                    list() = $file;
                    $image = $category->addChild('image');
                    $image->addChild('path', $path_to_image_dir.'/'.$file);
                    $image->addChild('height', $height);
                    $image->addChild('width', $width);
                }
            }
        }
        else
        {
            if (is_file($path_to_image_dir.'/'.$file))
            {
                list($width, $height) = getimagesize($path_to_image_dir.'/'.$file);
                $image = $xml_generator->addChild('image');
                $image->addChild('path', $path_to_image_dir.'/'.$file);
                $image->addChild('height', $height);
                $image->addChild('width', $width);
            }
        }

    }
    closedir($handle);
}
*/

$file = fopen('images.xml','w');
fwrite($file, $xml_generator->asXML());
fclose($file);
?>
 
Hi,
für solche Probleme benutzt man meistens eine rekursive Funktion, da man dann die ganze Sache recht elegant machen kann. Recht vernünftig ginge es z.B. so:
PHP:
function get_filesystem_xml($dir, SimpleXMLElement $parent)
{
 $it = new DirectoryIterator($dir);

 while($it->valid())
 {
  if($it->isFile())
  {
   $child = $parent->addChild('image');
   $child->setAttribute('name', $it->getFilename());
  }
  elseif($it->isDir() && !$it->isDot())
  {
   $child = $parent->addChild('category');
   $child->setAttribute('name', $it->getFilename());
   get_filesystem_xml($it->getPathname(), $child);
  }

  $it->next();
 }
}
Der Aufruf erfolgt dann in etwa so:
PHP:
$root = new SimpleXMLElement('<?xml version="1.0"?><root/>');
get_filesystem_xml($DIR, $root);
Wobei $DIR dein Startverzeichnis ist. Nach dem Aufruf der Funktion hast du dann in $root den kompletten ausgelesenen XML-Baum.
 
Zuletzt bearbeitet:
Wow... Super!

Danke für die schnelle Antwort und vorallem für die aussagekräftigen Kommentare.
Das hilft mir weiter... Danke!

EDIT:
Beide Varianten sind super... Danke euch nochmals
 
Zuletzt bearbeitet:
Zurück