Jak serializować / zapisywać DOMElement w $ _SESSION?

Jestem całkiem nowy w PHP, DOM i implementacji PHP DOM. To, co próbuję zrobić, to zapisać element głównyDOMDocument w$_SESSION zmienna, dzięki czemu mogę uzyskać do niej dostęp i modyfikować ją przy kolejnych ładowaniach strony

Ale podczas używania pojawia się błąd w PHP$_SESSION aby zapisać stan DOMElement:

Ostrzeżenie: DOMNode :: appendChild () [domnode.appendchild]: Nie można pobrać DOMElement

Przeczytałem, że nie można zapisać obiektu DOMDocument PHP$_SESSION natywnie. Można to jednak zapisać, zapisując serializację DOMDocument (np.$_SESSION['dom'] = $dom->saveXML()).

Nie wiem, czy to samo dotyczy zapisywania aDOMElement do a$_SESSION również zmienna, ale to właśnie próbowałem. Powodem, dla którego chcę to zrobić, jest użycie rozszerzonej klasy DOMElement z jedną dodatkową właściwością. Miałem nadzieję, że zapisując root DOMElement w $ _SESSION, będę mógł później pobrać element i zmodyfikować tę dodatkową właściwość i wykonać test, taki jak, if (additionalProperty === false) {coś zrobić; }. Czytałem również, że zapisując DOMDocument, a później pobierając go, wszystkie elementy są zwracane jako obiekty z rodzimych klas DOM. To znaczy, nawet jeśli użyłem rozszerzonej klasy do tworzenia elementów, właściwość, której później potrzebuję, nie będzie dostępna, ponieważ odwołanie do zmiennej zmiennej do obiektu klasy rozszerzonej wyszło poza zakres - dlatego I ' Próbuję tego innego. Próbowałem najpierw użyć rozszerzonej klasy (nieuwzględnionej poniżej), ale dostałem błędy ... więc wróciłem do korzystania z obiektu DOMElement, aby sprawdzić, czy jest to problem, ale wciąż otrzymuję te same błędy. Oto kod:

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

Ten kod podaje następujące błędy (w zależności od tego, czy używam appendChild bezpośrednio, czy skomentowanej linii kodu za pomocą 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

Mam kilka pytań. Po pierwsze, co powoduje ten błąd i jak go naprawić? Ponadto, jeśli to, co próbuję zrobić, nie jest możliwe, to jak mogę osiągnąć mój ogólny cel, jakim jest zapisanie „stanu” drzewa DOM przy użyciu niestandardowej właściwości dla każdego elementu? Zauważ, że dodatkowa właściwość jest używana tylko w programie i nie jest atrybutem do zapisania w pliku XML. Ponadto nie mogę po prostu zapisać DOM z powrotem do pliku za każdym razem, ponieważ DOMDocument po modyfikacji może nie być poprawny zgodnie ze schematem używanym przeze mnie później, gdy dodatkowe modyfikacje / dodatki zostały wykonane w DOMDocument. Dlatego muszę zapisać tymczasowo nieprawidłowy DOMDocument. Dziękujemy za każdą radę!

EDYCJA: Po wypróbowaniu rozwiązania hakre kod zadziałał. Następnie przeszedłem do próby użycia rozszerzonej klasy DOMElement i, jak podejrzewałem, nie zadziałało. Oto nowy kod:

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

Daje mi błądUndefined property: DOMElement::$frozen. Jak wspomniałem w moim oryginalnym poście, posaveXML iloadXML, element pierwotnie utworzony za pomocąFreezableDOMElement powraca typDOMElement dlategofrozen właściwość nie jest rozpoznawana. Czy jest jakiś sposób na to?

questionAnswers(1)

yourAnswerToTheQuestion