Как сериализовать / сохранить элемент 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 собственность не признается. Есть ли способ обойти это?

Ответы на вопрос(1)

Ваш ответ на вопрос