私はPHP、DOM、およびPHP DOMの実装が新しくなっています。私がしようとしているのはDOMDocument
のルート要素を$_SESSION
変数に保存することです。そのため、それにアクセスして以降のページの読み込み時に変更することができます。 DOMElementの
警告:DOMNodeを::のappendChild()[domnode.appendchild] DOMElementの状態を保存するために
$_SESSION
を使用した場合しかし、私はPHPでエラーが出ます
PHP DOMDocumentオブジェクトをネイティブに
$_SESSION
に保存することはできません。ただし、DOMDocumentのシリアル化を保存することで節約できます(例:$_SESSION['dom'] = $dom->saveXML()
)。
DOMElement
を$_SESSION
変数に保存しても同じことが当てはまるかどうかはわかりませんが、それは私が試していたものです。これを行うための私の理由は、1つの追加プロパティでDOMElementの拡張クラスを使用することです。 $ _SESSIONにルートDOMElementを保存することで、後で要素を取得してこの追加のプロパティを変更し、if(additionalProperty === false){何かを実行することができます。 }。また、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
というプロパティが認識されないからです。これを回避する方法はありますか?
迅速な対応に感謝します。あなたが説明したソリューションを実装しようとしています。しかし、XML文字列がDOMDocumentに再ロードされたときに、拡張されたクラスプロパティにアクセスできないという問題に直面しているようです。 – neizan
@neizan:ここで何を話していますか?独自のシリアライゼーションを行う場合は、探しているすべての可能性があるはずです。 XMLはシリアライゼーションの形式であるため、通常はDOMDocumentをシリアル化するのは意味をなさないことです。 – hakre
私がシリアライゼーションを言ったとき、私は 'saveXML'メソッドの使用を指していました。混乱して申し訳ありません。私がちょうどあなたが言うことをしようと投稿した追加のサンプルコードを見てください。これは 'DOMElement'を使って動作しましたが、拡張クラス' FreezableDOMElement'では動作しませんでした。 – neizan