SimpleXML -> xpath()

Ritchizzle

Grünschnabel
Guten Tag zusammen

Ich habe ein kleines Problem, und zwar habe ich folgendes XML & PHP - Code:

Code:
<root>
   <structure id="3" name="name" lang="de">
      <folder id="279" name="Datenpool">
         <folder id="278" name="Bücher">
           
            <object id="9386" type="5" typename="beitrag">
               <name>test1</name>
               <stable_since>1236680370</stable_since>
               <publishing>01.02.2009</publishing>
               <expiration>09.04.2009</expiration>
             </object>

             <object id="9383" type="5" typename="beitrag">
                <name>test2</name>
                <stable_since>1236680414</stable_since>
                <publishing>10.03.2009</publishing>
                <expiration>10.04.2009</expiration>
              </object>

              <object id="9391" type="5" typename="beitrag">
                 <name>test3</name>
                 <stable_since>1236011220</stable_since>
                 <publishing>02.03.2009</publishing>
                 <expiration>02.03.2010</expiration>
              </object>
           </folder>
        
        <folder id="280" name="Zeitschriften">
           <folder id="284" name="T1">

              <object id="9390" type="5" typename="beitrag">
                 <name>Test4</name>
                    <stable_since>1235579427</stable_since>
                    <publishing>09.02.2009</publishing>
                    <expiration>13.02.2010</expiration>
              </object>
         
           </folder>
        </folder> 
     </folder>
  </structure>
</root>


PHP:
$xmlStr = file_get_contents('http://xxxx.de/test.xml');

$xml = new SimpleXMLElement($xmlStr);
$result = $xml->xpath('/root');

Nun würde ich gerne mit xpath() jeweils nur die Objekte (rot) auslesen, jedoch habe ich nun das Problem, dass die Objekte jeweils n-mal in sogennante Folders (blau) unterteilt sind.

Gibt es eine Möglichkeit das das Resultat nur nach Objects zu durchsuchen?

Vielen Dank für Eure Antworten

Gruss

ritchizzle
 
Ist nur so eine Idee.
MfG, Andy

PHP:
// load simplexml object
$xml = new SimpleXMLElement($string);

// initiate path
$path = '/root';

// check for a sub result
while( $result = $xml->xpath($path) )
{
    // add objects to result array
    $objects[] = $result->object ;

    // add one layer to path
    $path .= '/folder';
}
 
Versuch mal das:

PHP:
<?php
function retrieveElements($elements = null)
{
    if($elements == null)
    {
        throw new Exception("Elements must not be null!");
    }
        
    $result = array();
    
    foreach($elements as $element)
    {
        if( property_exists($element, "folder") )
        {
            $result = array_merge($result, retrieveElements($element->folder));
        }
        else
        {
            foreach($element->object as $object)
                $result[] = $object;
        }
    }
    
    return $result;
}

try
{
    $fc = file_get_contents('test.xml');
    $xml = simplexml_load_string($fc);
    
    $elements = $xml->xpath('/root/structure/folder');
    
    foreach(retrieveElements($elements) as $element)
    {
        echo "<pre>";
        var_dump($element);
        echo "</pre>";
    }
}
catch(Exception $e)
{
    echo $e->getMessage();
}
?>

Grüße
 
Zurück