Frage

Vor ungefähr einem Jahr schrieb ich eine von JQuery inspirierte Bibliothek, in der Sie das DOM mit XPath und Domdocument von PHP manipulieren konnten. Ich wollte es kürzlich aufräumen und als Open -Source -Projekt veröffentlichen. Ich habe in den letzten Tagen Verbesserungen vorgenommen und mehr der nativen OO -Funktionen von PHP implementiert.

Wie auch immer, ich dachte, ich würde eine neue Methode hinzufügen, mit der Sie ein separates XML -Dokument mit dem aktuellen zusammenführen können. Der Haken hier ist, dass diese Methode nach 2 XPath -Ausdrücken fragt. Der erste holt die Elemente ab, die Sie in das vorhandene Dokument zusammenarbeiten möchten. Der zweite gibt den Zielweg dieser zusammengeführten Elemente an.

Die Methode funktioniert gut, um passende Elemente von beiden Pfaden abzurufen, aber ich habe Probleme beim Importieren der ausländischen Elemente in den aktuellen DOM. Ich erhalte immer wieder die gefürchtete Nachricht "Falscher Dokumentfehler".

Ich dachte, ich wüsste, was ich tat, aber ich nehme an, ich habe mich geirrt. Wenn Sie sich den folgenden Code ansehen, können Sie sehen, dass ich die erste Iteration durch die aktuellen Dokumente übereinstimmende Elemente und dann über die übereinstimmenden Elemente des ausländischen Dokuments bin.

In der zweiten verschachtelten Schleife versuche ich, jedes fremde Element im aktuellen Dokument in den Zielweg zu verschmelzen.

Ich bin mir nicht sicher, was ich hier falsch mache, da ich den fremden Knoten eindeutig in das aktuelle Dokument importiere, bevor ich ihn angehe.

public function merge($source, $path_origin, $path_destination)
{
    $Dom = new self;

    if(false == $Dom->loadXml($source))
    {
        throw new DOMException('XML source could not be loaded into the DOM.');
    }

    $XPath = new DOMXPath($Dom);

    foreach($this->path($path_destination, true) as $Destination)
    {
        if(false == in_array($Destination->nodeName, array('#text', '#document')))
        {
            foreach($XPath->query($path_origin) as $Origin)
            {
                if(false == in_array($Destination->nodeName, array('#text', '#document')))
                {
                    $this->importNode($Origin, true);

                    $Destination->appendChild($Origin->cloneNode(true));
                }
            }
        }
    }

    return $this;
}

Sie finden die Bibliothek im folgenden Github Repo in ihrer Gesamtheit:

http://github.com/wilhelm-murdoch/dominy

HALPS !!!

War es hilfreich?

Lösung

importNode ändert den Knoten nicht, also gehört er zu einem anderen Dokument. Es erstellt einen neuen Knoten, der zum neuen Dokument gehört, und gibt es zurück. Sie sollten also den Rückgabewert erhalten und verwenden das in appendChild.

$Destination->appendChild($this->importNode($Origin, true));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top