Frage

Ok, also musste ich diese kleine aber feine Idee, die andere Nacht eine Hilfsklasse für DomDocument zu schaffen, dass imitiert, zu einem gewissen Grad, jQuery Fähigkeit, das DOM einer HTML oder XML-basierten Zeichenfolge zu manipulieren. Anstelle von CSS-Selektoren wird XPath verwendet. Zum Beispiel:

$Xml->load($source)
    ->path('//root/items')
    ->each(function($Context)
    {
        echo $Context->nodeValue;
    });

Dies würde eine Callback-Funktion auf jedem resultierenden Knoten aufzurufen. Leider PHP-Version <5.3.x nicht Lambda-Funktionen oder Schließungen unterstützen, so bin ich gezwungen, etwas ein bisschen mehr wie dies für den Augenblick zu tun:

$Xml->load($source)
    ->path('//root/items')
    ->walk('printValue', 'param1', 'param2');

Alles funktioniert groß im Moment, und ich denke, das Projekt zu vielen Menschen nützlich sein würde, aber ich bin mit einem der Funktionen fest. Ich versuche, jQuery ‚ersetzen‘ Methode nachzuahmen. Verwenden Sie den folgenden Code, kann ich dies erreichen ganz einfach durch die folgende Methode anwenden:

$Xml->load($source)
    ->path('//root/items')
    ->replace($Xml->createElement('foo', 'bar')); // can be an object, string or XPath pattern

Der Code hinter dieser Methode ist:

public function replace($Content)
{
    foreach($this->results as $Element)
    {
        $Element->parentNode->appendChild($Content->cloneNode(true));
        $Element->parentNode->removeChild($Element);
    }

    return $this;
}

Nun, das funktioniert. Er ersetzt jedes resultierendes Element mit einer geklonten Version von $ Inhalt. Das Problem ist, dass es sie an die Unterseite der übergeordneten Knoten in der Liste der Kinder ergänzt. Die Frage ist, wie kann ich klonen dieses Element andere Elemente zu ersetzen, während immer noch die ursprüngliche Position in der DOM-Halte?

Ich dachte über Reverse-Engineering den Knoten I ersetzen sollte. Grundsätzlich Kopieren über Werte, Attribute und Elementname von $ Inhalt, aber ich bin nicht in der Lage, den tatsächlichen Elementnamen des Zielelementes zu ändern.

Reflexion könnte eine Möglichkeit sein, aber es muss doch ein einfacherer Weg, dies zu tun.

Wer?

War es hilfreich?

Lösung

Verwenden replaceChild statt appendChild / removeChild.

Andere Tipps

Lookup, wenn $ Element einer nextsibbling vor dem Entfernen, wenn so ein insert zu tun, die sonst einfach nächste Geschwister hängen.

public function replace($Content)
{
        foreach($this->results as $Element)
        {
                if ($Element->nextSibling) {
                    $NextSiblingReference = $Element->nextSibling;
                    $Element->parentNode->insertBefore($Content->cloneNode(true),$NextSiblingReference);
                }
                else {
                    $Element->parentNode->appendChild($Content->cloneNode(true));   
                }
                $Element->parentNode->removeChild($Element);
        }

        return $this;
}

Völlig ungetestet though.

oder als AnthonyWJones vorgeschlagen replaceChild , großen Pep wie habe ich vermisse diesen Moment:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top