phpbar.de logo

Mailinglisten-Archive

[php] DOMNode->appendChild() an bestimmte Stelle der Nodelist

[php] DOMNode->appendChild() an bestimmte Stelle der Nodelist

Albin Blaschka albin.blaschka at sbg.ac.at
Don Aug 18 21:28:20 CEST 2005


Jens Giessmann schrieb:
> Hi,
> 
> Ich muss/moechte in eine bestehende XML Strukur einen neuen Node
> einhaengen.
> 
> An sich kein Problem, aber, ich moechte es an einer bestimmten Stelle
> tun und nicht einfach hinten anhaengen.
> 
> Ich verwende dazu PHP5.
> 
> Bsp:
> 
> Ausgangspunkt ist folgende XML-Struktur
> 
> ----------------------------------------------------------------------
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <root>
>   <parent>
>     <child/>
>     <child/>
>   </parent>
> </root>
> ----------------------------------------------------------------------
> 
> Jetzt kann ich mit dem folgenden Code einen neuen Node in
> <parent></parent> einfuegen.
> 
> ----------------------------------------------------------------------
> <?php 
>  
> $xml_src = 'test.xml'; 
>  
> $parent_path = "//parent"; 
>  
> // Create a new DOM document 
> $dom = new DomDocument();   
> $dom->load($xml_src);  
>  
> // Find the parent node 
> $xpath = new DomXPath($dom); 
> $parent = $xpath->query($parent_path); 
>  
> // Create an element 
> $element = $dom->createElement('neuernode'); 
>  
> // Append the element 
> $parent->item(0)->appendChild($element); 
>  
> echo $dom->saveXML(); 
>  
> ?> 
> ----------------------------------------------------------------------
> 
> ergibt:
> 
> ----------------------------------------------------------------------
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <root>
>   <parent>
>     <child/>
>     <child/>
>     <neuernode/>
>   </parent>
> </root>
> ----------------------------------------------------------------------
> 
> Haben will ich aber z.B.:
> 
> ----------------------------------------------------------------------
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <root>
>   <parent>
>     <child/>
>     <neuernode/>
>     <child/>
>   </parent>
> </root>
> ----------------------------------------------------------------------
> 
> Irgendwelche Ideen?
> 
> Die Nachbarkinder anhand von Parametern und XPath kann ich problemlos
> finden, ich hab nur keinen Plan wie ich appendchild() das Ziel
> beibringen kann. (habe die Params hier im Bsp. der Einfachheit halber
> weggelassen).
> 
> Hab auch schon gedacht zu versuchen die Nodeliste nach dem Append zu
> sortieren, aber vielleicht weiss ja irgendwer was Pfiffiges ;-)
> 


Hallo,

ich mach das so, daß ich (hier in deinem Beispiel) <parent></parent>
ersetze: Hier meine Funktion, sie dient eigentlich zum Einfügen des
Inhalts in ein XHTML-Template über Parameter, die ich mir mit XPath
hole, einige Anpassungen sind wahrscheinlich notwendig, ich hoffe es
wird mit Beispiel klar. Sie stammt eigentlich aus einer Klasse...
Ich habe sie ein bißchen gestutzt, sie ist nicht genau auf Dein Problem
zugeschnitten, aber vielleicht hilft's!

$template: das XML-File wo eingefügt werden soll:
z.B.:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<parent param="ersetze">
<child/>

</parent>
</root>

$snip: was eingefügt werden soll:
<parent param="ersetze">
<child/>
<neuernode>Bla</neuernode>
<child/>
</parent>

$where: Der Name des Parameters, wo eingefügt/des Teils der ersetzt
werden soll, hier also "param".
$type: Der Wert des Parameters, wo eingefügt/des Teils der ersetzt
werden soll, hier also "ersetze".
Was jetzt noch drinnen ist, ist die registrierung des Namespaces, ich
hab's lassen, vielleicht brauchst Du es ja ;-)


function insertSnip ($snip, $where, $param) {
        $xp = new DOMXPath($template);
        $xp->registerNamespace('xhtml', 'http://www.w3.org/1999/xhtml');

        if (isset($param) == TRUE and is_array($param) == TRUE) {
            while (list ($key, $val) = each ($param)) {
                $query = '//xhtml:'.$where.'[@'.$key.'="'.$val.'"]';
            }
        }else{
            $query = '//xhtml:'.$where;
        }
        $result = $xp->query($query);
        $snippet->loadXML($snip);
        foreach ($result as $node) {
            foreach ($snippet->documentElement->childNodes as $element){
                $newnode = $this->importNode($element,TRUE);
                $node->appendChild($newnode);
            }
        }
    }

Grüße & HTH,

Albin
-- 
---------------------------------------------------------------------
| Albin Blaschka, Mag. rer.nat
| Fachbereich für Organismische Biologie, Universität Salzburg
| Hellbrunnerstr. 34, A - 5020 Salzburg, Österreich
|
| It's hard to live in the mountains, hard, but not hopeless!
---------------------------------------------------------------------

php::bar PHP Wiki   -   Listenarchive