Announcement

Collapse
No announcement yet.

Zugriff auf ein Element wenn Bedingungen bei 2 Ancestors erfüllt sind

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriff auf ein Element wenn Bedingungen bei 2 Ancestors erfüllt sind

    Hallo zusammen,

    Ich habe folgende XML-Struktur, in der ich alle <image> suche, wenn das <item> eine bestimmte @number hat, sowie die <page> eine bestimmte Nummer hat. Leider kommt immer ein leeres Array raus:

    PHP Code:
    <itemList>
           <
    page number="8 1">
                <
    item number="1">
                    <
    image number="1">/Users/admin/Desktop/haus1.jpg</image>
                    <
    image number="2">/Users/admin/Desktop/haus2.jpg</image>
                    <
    image number="3">/Users/admin/Desktop/haus3.jpg</image>
                </
    item>
                <
    item number="2">
                    <
    image number="1">/Users/admin/Desktop/haus1.jpg</image>
                </
    item>
                </
    page>
                <
    page number="2 3">
    .... 
    Wie man sieht kann <item> ein oder mehrere <image> haben...

    Ich versuche das gerade mit 3 Schleifen ineinander:

    PHP Code:
    // hier hole ich alle @number einer bestimmten <page>
                
    $counterItemsInPage getXMLContent($genXML"//page[@number = '" $realPages[0] . ' ' $realPages[1] . "']/item/@number");
                
    //hier erhalte ich ein Ergebnis
                
    echo '<pre>'var_dump($counterItemsInPage); echo '</pre>';
                
                
    // durch max($counterItemsInPage) weiß ich nun wieviel <item> in der <page> sind (count würde auch gehen)
                
    for ($c 1$c <= max($counterItemsInPage); $c++) {

                    
    // jetzt will ich alle Nummern der <image> aus dem <item> pro <page>
                    
    $itemsImagesNumbersWithinSpread getXMLContent($genXML"//image/@number/../../page[@number = '" $realPages[0] . ' ' $realPages[1] . "']/item[number='" $c "']");
                    
    // hier ist das Array = NULL
                    
    echo '<pre>'var_dump($itemsImagesNumbersWithinSpread); echo '</pre>';
                    
                    foreach (
    $itemsImagesNumbersWithinSpread as $t => $counter2) {
                        
    // hole alle Bildpfade der Bilder, die in einem <item> auf einer best. <page> sind
                        
    $itemsImagesWithinSpread getXMLContent($genXML"//page[@number = '" $realPages[0] . ' ' $realPages[1] . "']/item[number='" . ($t 1) . "']/image[number='" $t "'");
                        
    // das Array ist dann natürlich auch = NULL
                        
    echo '<pre>'var_dump($itemsImagesWithinSpread); echo '</pre>'
    die Funktion dazu sieht folgendermaßen aus:

    PHP Code:
    function getXMLContent($doc$tagPath) {

        
    $targets = new DOMXpath($doc);
        
    $targetDatas $targets->query($tagPath);

        if (!
    is_null($targetDatas)) {
            
    $result = array();
            foreach (
    $targetDatas as $targetData) {
                
    $nodes $targetData->childNodes;
                foreach (
    $nodes as $node) {
                    
    $value $node->nodeValue;
                    
    $result[] = $value;
                }
            }
            return 
    $result;
        }

    Ich würde mich freuen, wenn mir jemand helfen könnte - ich teste hier schon ne Weile rum mit den verschiedensten XPATH-Expressions, aber bekomme immer leere Arrays zurück. Danke im Voraus.

    Gruss
    Dom

  • #2
    Diese XPath-Abfragen ergeben mit der Beispielstruktur das gesuchte Ergebnis:

    /itemList/page[@number = '8 1']/item[@number = '1']//image --> 3 Bilder
    /itemList/page[@number = '8 1']/item[@number = '2']//image --> 1 Bild

    oder von image ausgehend:

    //image[parent::item[@number = '1'] and ancestor:age[@number = '8 1']] --> 3 Bilder
    //image[parent::item[@number = '2'] and ancestor:age[@number = '8 1']] --> 1 Bild
    Zuletzt editiert von Thomas Meinike; 22.07.2012, 12:46.

    Comment

    Working...
    X