Как сериализовать / сохранить элемент DOME в $ _SESSION?
Я довольно новичок в PHP, DOM и реализации PHP DOM. Я пытаюсь сохранить корневой элементDOMDocument
в$_SESSION
переменная, чтобы я мог получить к нему доступ и изменить его при последующих загрузках страницы.
Но я получаю ошибку в PHP при использовании$_SESSION
сохранить состояние DOMElement:
Warning: DOMNode::appendChild() [domnode.appendchild]: Couldn't fetch DOMElement
Я прочитал, что объект PHP DOMDocument не может быть сохранен в$_SESSION
изначально. Однако его можно сохранить, сохранив сериализацию DOMDocument (например,$_SESSION['dom'] = $dom->saveXML()
).
Я не знаю, верно ли то же самое для сохраненияDOMElement
к$_SESSION
переменная, но это то, что я пытался. Моя причина желания сделать это состоит в том, чтобы использовать расширенный класс DOMElement с одним дополнительным свойством. Я надеялся, что, сохранив корневой элемент DOMElement в $ _SESSION, я смогу позже извлечь элемент, изменить это дополнительное свойство и выполнить тест, как, например, (AdditionalProperty === false) {сделать что-то; }. Я также читал, что при сохранении DOMDocument и последующем его получении все элементы возвращаются как объекты из собственных классов DOM. То есть, даже если я использовал расширенный класс для создания элементов, свойство, которое мне впоследствии понадобится, не будет доступно, потому что переменная, содержащая ссылку на объект расширенного класса, вышла из области видимости - вот почему я & apos; Я пробую это другое. Сначала я попытался использовать расширенный класс (не включенный ниже), но получил ошибки ... поэтому я вернулся к использованию объекта DOMElement, чтобы проверить, не в этом ли проблема, но я по-прежнему получаю те же ошибки. Вот код:
<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>
Этот код дает следующие ошибки (в зависимости от того, использую ли я appendChild напрямую или закомментированную строку кода с помощью 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
У меня есть несколько вопросов. Во-первых, что вызывает эту ошибку и как ее исправить? Кроме того, если то, что я пытаюсь сделать, не представляется возможным, то как я могу достичь своей общей цели по спасению «состояния»? дерева DOM при использовании настраиваемого свойства для каждого элемента? Обратите внимание, что дополнительное свойство используется только в программе и не является атрибутом, который нужно сохранить в файле XML. Кроме того, я не могу просто сохранять DOM обратно в файл каждый раз, потому что DOMDocument после модификации может быть недействительным в соответствии со схемой, которую я использую, до тех пор, пока не будут выполнены дополнительные изменения / дополнения к DOMDocument. Вот почему мне нужно сохранить временно недействительный DOMDocument. Спасибо за любой совет!
Редакция: После попытки решения хакре код сработал. Затем я перешел к попытке использовать расширенный класс DOMElement, и, как я подозревал, это не сработало. Вот новый код:
<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>
Это дает мне ошибкуUndefined property: DOMElement::$frozen
, Как я уже упоминал в моем оригинальном сообщении, послеsaveXML
а такжеloadXML
элемент, изначально созданный сFreezableDOMElement
возвращается типDOMElement
вот почемуfrozen
собственность не признается. Есть ли способ обойти это?