phpbar.de logo

Mailinglisten-Archive

[php] XML-Datei durchgehen, Nodes anhand Parameter löschen

[php] XML-Datei durchgehen, Nodes anhand Parameter löschen

Albin Blaschka albin at albinblaschka.info
Don Dez 28 00:04:09 CET 2006


Guten Abend!

Folgende Ausgangslage:
Ich habe eine XML-Datei, die mir einen Menübaum beschreibt, sie sieht 
gekürzt in etwa so aus:

<ul id="navigation" class="horizontal">
    <li acl = "1"><a href = "edit.php">Daten pflegen</a>
        <ul acl = "1">
        <li acl = "1"><a href="edit.php?flag=input">Werk eingeben</a></li>
        <li acl = "1"><a href="edit.php?flag=edit">Werk editieren</a></li>
        </ul>
    </li>
    <li acl = "2"><a href = "filter.php">Filter</a>
        <ul>
          <li acl = "2"><a href = "filter.php?flag=set">Filtern</a></li>
          <li acl="2"><a href ="filter.php?flag=del">Filter löschen</a></li>
          </ul>
     </li>
    <li acl = "1"><a href = "script1.php">Ausgabe</a>
        <ul acl = "1">
            <li acl = "1"><a href = "script2.php">Persönliche Liste</a></li>
            <li acl = "2"><a href = "script3.php">Gesamtliste</a></li>
            <li acl = "2"><a href = "script4.php">Statistik</a></li>
        </ul>
    </li>
</ul>

Wichtig ist hier der Parameter acl, der soetwas wie ein 
einfaches Rechte-System umsetzt: der angemeldete User gehört also entweder 
Gruppe 1 oder 2 an und entsprechende Menü-Punkte soll er bekommen.

Auf der ersten Ebene funktioniert das mit folgender Methode:

public function buildMenu() {
            $query = '/ul/li[@acl="'.$this->perm.'"]';
            $xpath = new DOMXPath($this->menu);
            $result = $xpath->query($query);
            $newDom = new DOMDocument();
            $root = $newDom->createElement('ul');
            $root->setAttribute('id','navigation');
            $root->setAttribute('class','horizontal');
            $root=$newDom->appendchild($root);
            foreach ($result as $node) {
                $simpleNode = simplexml_import_dom($node);
                if ((int)$simpleNode['acl'] <= (int)$this->perm) {
                    $root->appendChild($newDom->importNode($node,TRUE));
                }
            }
            return $newDom->saveXML();
}

Aber eben nur auf der *ersten* Ebene... Alle meine Versuche, das ganze "in 
die Tiefe" gehen zu lassen, schlagen fehl. Ich weiß, daß der zweite 
Parameter bei der Methode $newDom->importNode, also das TRUE sagt, daß alle 
nachfolgenden Knoten mitgenommen werden.
Ich habe diese Funktion mir gebaut und wollte sie dann erweitern, bin aber 
hoffnungslos gescheitert, darum auch keine weiterführenden Code-Snippets... 
:-(

Es geht also nach meinem Verständnis darum, den Parameter TRUE 
herauszunehmen und mit Rekursion zu prüfen was im Parameter acl steht und 
entsprechend den Knoten in den neuen Baum ($newDom) einzubauen... und mit 
Rekursion hapert's bei mir anscheinend grundlegend, weil alles was ich damit 
erreiche ist Kopfweh ;-(

Ich mach's auch gern andersherum, streiche die Knoten, die nicht 
hineinpassen...hatte aber auch in dieser Richtung keinen Lichtblitz...

Anmerkung: Aus dieser XHTML-Liste wird ein dynamisches Menü...

Wenn mir wer weiterhelfen könnte, hätte ich vielleicht doch noch ein 
(verspätetes) Christkind ;-)

Danke im Voraus,
Albin

--
| Albin Blaschka, Mag.rer.nat.
| Etrichstrasse 26, A-5020 Salzburg
|  * www.albinblaschka.info * www.thinkanimal.info *
| - It's hard to live in the mountains, hard but not hopeless!


php::bar PHP Wiki   -   Listenarchive