私は、PHP、DOM、および PHP DOM の実装にかなり慣れていません。私がやろうとしているのは、のルート要素を変数に保存してDOMDocument
、$_SESSION
後続のページの読み込み時にアクセスして変更できるようにすることです。
しかし$_SESSION
、DOMElement の状態を保存するために使用すると、PHP でエラーが発生します。
警告: DOMNode::appendChild() [domnode.appendchild]: DOMElement を取得できませんでした
$_SESSION
PHP DOMDocument オブジェクトをネイティブに保存できないことを読みました。ただし、DOMDocument のシリアル化を保存することで保存できます (例: $_SESSION['dom'] = $dom->saveXML()
)。
DOMElement
aを aに保存する場合も同じことが当てはまるかどうかはわかりません$_SESSION
変数もありますが、それが私が試みていたことです。これを行う理由は、DOMElement の拡張クラスに 1 つの追加プロパティを使用するためです。ルート DOMElement を $_SESSION に保存することで、後で要素を取得してこの追加のプロパティを変更し、次のようなテストを実行できることを期待していました。}。また、DOMDocument を保存し、後でそれを取得すると、すべての要素がネイティブ DOM クラスからオブジェクトとして返されることも読みました。つまり、拡張クラスを使用して要素を作成したとしても、拡張クラス オブジェクトへの参照を保持する変数がスコープ外になっているため、後で必要になるプロパティにアクセスできません。この他のことを試しています。最初に拡張クラス(以下には含まれていません)を使用しようとしましたが、エラーが発生しました... そのため、DOMElement オブジェクトを使用してそれが問題であるかどうかを確認しましたが、それでも同じエラーが発生します。コードは次のとおりです。
<?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;
?>
このコードでは、次のエラーが発生します (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 ファイルに保存される属性ではないことに注意してください。また、DOMDocument は、変更後、追加の変更/追加が DOMDocument に対して実行されるまで、使用しているスキーマに従って有効ではない可能性があるため、毎回 DOM をファイルに保存することはできません。そのため、一時的に無効な DOMDocument を保存する必要があります。アドバイスをありがとう!
EDITED:hakreのソリューションを試した後、コードは機能しました。次に、DOMElement の拡張クラスを使用しようとしましたが、おそらくうまくいきませんでした。新しいコードは次のとおりです。
<?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;
}
}
?>
それは私にエラーを与えますUndefined property: DOMElement::$frozen
。元の投稿で述べたように、 と の後saveXML
にloadXML
、最初にインスタンス化された要素FreezableDOMElement
が型を返すDOMElement
ため、frozen
プロパティが認識されません。これを回避する方法はありますか?