Wie kann ich ein DOMElement in $ _SESSION serialisieren / speichern?

Ich bin ziemlich neu in PHP, DOM und der PHP-DOM-Implementierung. Was ich versuche zu tun ist, speichern Sie das Stammelement derDOMDocument in einem$_SESSION Variable, damit ich darauf zugreifen und es bei nachfolgenden Seitenladevorgängen ändern kann.

Aber ich bekomme einen Fehler in PHP bei der Verwendung$_SESSION So speichern Sie den Status von DOMElement:

Warnung: DOMNode :: appendChild () [domnode.appendchild]: DOMElement konnte nicht abgerufen werden

Ich habe gelesen, dass ein PHP DOMDocument-Objekt nicht gespeichert werden kann$_SESSION nativ. Es kann jedoch gespeichert werden, indem die Serialisierung des DOMDocument (z.$_SESSION['dom'] = $dom->saveXML()).

Ich weiß nicht, ob dies auch für das Speichern von a giltDOMElement zu einem$_SESSION auch variabel, aber das habe ich versucht. Mein Grund dafür ist die Verwendung einer erweiterten Klasse von DOMElement mit einer zusätzlichen Eigenschaft. Ich hatte gehofft, dass ich durch Speichern des Root-DOMElements in $ _SESSION das Element später abrufen und diese zusätzliche Eigenschaft ändern und einen Test durchführen könnte, wie zum Beispiel: if (additionalProperty === false) {do something; }. Ich habe auch gelesen, dass beim Speichern und späteren Abrufen eines DOMDocuments alle Elemente als Objekte aus systemeigenen DOM-Klassen zurückgegeben werden. Das heißt, selbst wenn ich eine erweiterte Klasse zum Erstellen von Elementen verwendet habe, ist die Eigenschaft, die ich anschließend benötige, nicht verfügbar, da die Variable, die den Verweis auf das Objekt der erweiterten Klasse enthält, nicht mehr gültig ist. Ich versuche dieses andere Ding. Ich habe zuerst versucht, die erweiterte Klasse (im Folgenden nicht enthalten) zu verwenden, habe aber Fehler erhalten. Daher habe ich wieder ein DOMElement-Objekt verwendet, um festzustellen, ob dies das Problem ist, aber es werden immer noch dieselben Fehler angezeigt. Hier ist der Code:

<code><?php
session_start();

$rootTag = 'root';
$doc = new DOMDocument;

if (!isset($_SESSION[$rootTag])) {
    $_SESSION[$rootTag] = new DOMElement($rootTag);
}

$root = $doc->appendChild($_SESSION[$rootTag]);
//$root = $doc->appendChild($doc->importNode($_SESSION[$rootTag], true));

$child = new DOMElement('child_element');
$n = $root->appendChild($child);

$ct = 0;
foreach ($root->childNodes as $ch) echo '<br/>'.$ch->tagName.' '.++$ct;

$_SESSION[$rootTag] = $doc->documentElement;
?>
</code>

Dieser Code gibt die folgenden Fehler aus (abhängig davon, ob ich appendChild direkt oder die kommentierte Codezeile mit importNode verwende):

Warning: DOMNode::appendChild() [domnode.appendchild]: Couldn't fetch DOMElement in C:\Program Files\wamp_server_2.2\www\test2.php on line 11

Warning: DOMDocument::importNode() [domdocument.importnode]: Couldn't fetch DOMElement in C:\Program Files\wamp_server_2.2\www\test2.php on line 12

Ich habe mehrere Fragen. Was verursacht diesen Fehler und wie behebe ich ihn? Wenn das, was ich versuche, nicht möglich ist, wie kann ich dann mein allgemeines Ziel erreichen, den Status eines DOM-Baums zu speichern, während ich für jedes Element eine benutzerdefinierte Eigenschaft verwende? Beachten Sie, dass die zusätzliche Eigenschaft nur im Programm verwendet wird und kein Attribut ist, das in der XML-Datei gespeichert werden soll. Außerdem kann ich das DOM nicht jedes Mal in einer Datei speichern, da das DOMDocument nach einer Änderung möglicherweise nicht nach einem von mir verwendeten Schema gültig ist, bis später weitere Änderungen / Ergänzungen am DOMDocument vorgenommen wurden. Aus diesem Grund muss ich ein vorübergehend ungültiges DOMDocument speichern. Danke für jeden Rat!

BEARBEITET: Nachdem ich die Lösung von hakre ausprobiert hatte, funktionierte der Code. Dann versuchte ich, eine erweiterte Klasse von DOMElement zu verwenden, und, wie ich vermutete, funktionierte dies nicht. Hier ist der neue Code:

<code><?php
session_start();
//$_SESSION = array();
$rootTag = 'root';
$doc = new DOMDocument;

if (!isset($_SESSION[$rootTag])) {
    $root = new FreezableDOMElement($rootTag);
    $doc->appendChild($root);
} else {
    $doc->loadXML($_SESSION[$rootTag]);
    $root = $doc->documentElement;
}

$child = new FreezableDOMElement('child_element');
$n = $root->appendChild($child);

$ct = 0;
foreach ($root->childNodes as $ch) {
    $frozen = $ch->frozen ? 'is frozen' : 'is not frozen';
    echo '<br/>'.$ch->tagName.' '.++$ct.': '.$frozen;
    //echo '<br/>'.$ch->tagName.' '.++$ct;
}

$_SESSION[$rootTag] = $doc->saveXML();

/**********************************************************************************
 * FreezableDOMElement class
 *********************************************************************************/
class FreezableDOMElement extends DOMElement {
    public $frozen; // boolean value

    public function __construct($name) {
        parent::__construct($name);
        $this->frozen = false;
    }
}
?>
</code>

Es gibt mir den FehlerUndefined property: DOMElement::$frozen. Wie ich in meinem ursprünglichen Post erwähnt habe, danachsaveXML undloadXML, ein Element, das ursprünglich mit instanziiert wurdeFreezableDOMElement gibt Typ zurückDOMElement weshalb diefrozen Eigentum wird nicht anerkannt. Gibt es einen Weg, dies zu umgehen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage