2011-08-07 6 views
0
$doc = new DOMDocument(); 
$doc -> load("state.xml"); 
...snip... 
$neworder = $doc -> createElement("order"); 
    $neworder -> appendChild($type); 

最後のコード行が原因でスクリプトが失敗しています。 500 HTTP応答。私がコメントアウトすると、スクリプトは正常に動作します。このPHP DOMコードの何が問題になっていますか?

get_class()は、$ neworderと$ typeの両方がDOMElementクラスであることを確認します。何が問題なの?

...私は私が追加しようとしているノードを取得していた場所に

$タイプがどこから来るかこれは。

DOM_WRONG_DOCUMENT_ERR

Raised if newnode was created from a different document than the one that created this node.

+0

[エラー500が表示されるのはなぜですか](http://stackoverflow.com/questions/4651083/why-do-i-get-error-500) – AgentConundrum

+0

エラーメッセージは何ですか? –

+0

PHP致命的なエラー:メッセージ 'Wrong Document Error'でキャッチされていない例外 'DOMException'。 –

答えて

1

for ($i = 0; $i < $ordersummary -> length; $i++) 
{ 
    $o = $ordersummary -> item($i); 
    $type = $o -> getElementsByTagName("type") -> item(0); 
    ... 

と$ ordersummaryはjswolf19が指摘したように、あなたはドキュメントから、別のドキュメントからのノードを追加することはできません。この

$ordersummary -> loadXML($_POST["data"]); 
$ordersummary = $ordersummary -> getElementsByTagName("order"); 
0

のように得られ、ある文書から別の文書にノードを追加しようとするため、例外がスローされます。これはDOM APIではサポートされていません。

編集:唯一の根本的な回避策は、要素をディープコピーすることです。型が複雑なXML構造体であるかどうかによって、型ノードをXML文字列にシリアライズし、受け取るDOMDocumentオブジェクトのDOMDocumentFragmentを作成し、生のXMLをこのDOMDocumentFramgnentにロードするほうがずっと簡単です。次に、型XMLデータを挿入するDOMElementと同様に、DOMDocumentFragmentを追加できます。