2013-05-02 5 views
7

子供をノードに置き換えたり追加したりする際にエラーが発生します。「階層リクエストエラー」というメッセージがあるキャッチされない例外「DOMException」

必須です:

私はこれまで..

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 
    <person>Eva</person> 
    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 
    <p> 
     <person>Eva</person> 
    </p> 
    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

このようなエラーが

Fatal error: Uncaught exception 'DOMException' with message 'Hierarchy Request Error'

私のコードは

である変更したいです
function changeTagName($changeble) { 
    for ($index = 0; $index < count($changeble); $index++) { 
     $new = $xmlDoc->createElement("p"); 
     $new ->setAttribute("channel", "wp.com"); 
     $new ->appendChild($changeble[$index]); 
     $old = $changeble[$index]; 
     $result = $old->parentNode->replaceChild($new , $old); 
    } 
} 
+0

あなたは問題の詳細のXML要求を見ることができます... –

+0

私がreplaceChildを使用しようとすると、「階層要求エラー」というエラーが表示されます。私が間違っているものがわからない –

+0

ただノードが必要です。それはpタグで囲まれています。 –

答えて

36

PHPでのDOMDocumentとエラー階層リクエストエラーは、あなたが自分自身の中にノードを移動しようとしていることを意味します。以下の写真のヘビとこれを比較します。これはあなたのノードと同様

Snake eats itself

です。ノードを自分自身に移動します。つまり、その人をその段落に置き換えたい瞬間、その人はすでに段落の子です。

のappendChild()方法が効果的にすでにDOMツリーの外に人を移動させ、もはやの一部ではありません。

$para = $doc->createElement("p"); 
$para->setAttribute('attr', 'value'); 
$para->appendChild($person); 

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 

    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

エヴァはすでになくなっています。その親ノードはすでに段落です。

ので、代わりにあなたが最初に置き換えると、子を追加したい:

$para = $doc->createElement("p"); 
$para->setAttribute('attr', 'value'); 
$person = $person->parentNode->replaceChild($para, $person); 
$para->appendChild($person); 

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 
    <p attr="value"><person>Eva</person></p> 
    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

今、すべてがうまくています。

+0

これは私が欲しいものを正確に動作します。そして非常に非常にありがたい説明のためにありがとう。ありがとう –

+2

良い答え。ありがとう。 –

関連する問題