¿Cómo serializar / guardar un elemento DOM en $ _SESSION?

Soy bastante nuevo en PHP, DOM y la implementación de PHP DOM. Lo que estoy tratando de hacer es guardar el elemento raíz de laDOMDocument en un$_SESSION variable para que pueda acceder a ella y modificarla en las cargas de página subsiguientes.

Pero me sale un error en PHP al usar$_SESSION para guardar el estado de DOMElement:

Advertencia: DOMNode :: appendChild () [domnode.appendchild]: no se pudo recuperar DOMElement

He leído que un objeto PHP DOMDocument no se puede guardar en$_SESSION nativamente Sin embargo, se puede guardar guardando la serialización del DOMDocument (por ejemplo,$_SESSION['dom'] = $dom->saveXML()).

No sé si lo mismo es válido para guardar unDOMElement a un$_SESSION Variable también, pero eso es lo que estaba tratando. Mi razón para querer hacer esto es usar una clase extendida de DOMElement con una propiedad adicional. Esperaba que, al guardar el elemento DOM raíz en $ _SESSION, pudiera recuperar el elemento y modificar esta propiedad adicional y realizar una prueba como, si (la propiedad adicional === es falsa) {haga algo; }. También he leído que al guardar un DOMDocument y luego recuperarlo, todos los elementos se devuelven como objetos de clases nativas de DOM. Es decir, incluso si usé una clase extendida para crear elementos, la propiedad que posteriormente necesito no será accesible, porque la variable que contiene la referencia al objeto de clase extendida ha quedado fuera del alcance, por lo que ' Estoy intentando esta otra cosa. Intenté usar la clase extendida (no se incluye a continuación) primero, pero obtuve errores ... por lo que volví a usar un objeto DOMElement para ver si ese era el problema, pero sigo recibiendo los mismos errores. Aquí está el código:

<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>

Este código da los siguientes errores (dependiendo de si uso appendChild directamente o la línea de código comentada usando importNode):

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

Tengo varias preguntas. Primero, ¿qué está causando este error y cómo lo soluciono? Además, si lo que estoy tratando de hacer no es posible, ¿cómo puedo lograr mi objetivo general de guardar el 'estado' de un árbol DOM al usar una propiedad personalizada para cada elemento? Tenga en cuenta que la propiedad adicional solo se utiliza en el programa y no es un atributo para guardar en el archivo XML. Además, no puedo simplemente volver a guardar el DOM en el archivo cada vez, porque el DOMDocument, después de una modificación, puede no ser válido de acuerdo con el esquema que estoy usando hasta más tarde, cuando se hayan realizado modificaciones / adiciones adicionales al DOMDocument. Es por eso que necesito guardar un DOMDocument temporalmente inválido. Gracias por cualquier consejo!

EDITADO: Después de probar la solución de hakre, el código funcionó. Luego pasé a tratar de usar una clase extendida de DOMElement y, como sospechaba, no funcionó. Aquí está el nuevo código:

<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>

Me da el errorUndefined property: DOMElement::$frozen. Como mencioné en mi post original, después desaveXML yloadXML, un elemento originalmente instanciado conFreezableDOMElement está volviendo tipoDOMElement por eso elfrozen La propiedad no es reconocida. ¿Hay alguna manera de evitar esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta