2016-05-20 9 views
4

からルートノードでノードを交換する私が欲しいPHP:</p> <p>オリジナルXML :: DOMは、私は全体のノードから他のドキュメントから、ノードを更新する必要があり、別のDOM

<a> 
<b>Bat</b> 
</a> 

出力:

<a> 
<b>bi</b> 
</a> 

最初の試み:ドキュメント・によって置き換え

$original = "<a> 
    <b>Bat</b> 
    </a>"; 
    $replace = "<b>Bi</b>"; 

    $dom = new DOMDocument('1.0', 'utf-8'); 
    $dom->loadXML($original); 

    $xpath = new DOMXpath($dom); 
    $b = $xpath->query('//b')->item(0); 

    $fragment = $dom->createDocumentFragment(); 
    $fragment->appendXML($replace); 

    $dom->replaceChild($fragment, $b); 

    echo $dom->saveXML(); 

ERROR:

Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in /home/zital/scripts/php/dom.php:17 Stack trace:

0 /home/zital/scripts/php/dom.php(17): DOMNode->replaceChild(Object(DOMDocumentFragment), Object(DOMElement))

1 {main} thrown in /home/zital/scripts/php/dom.php on line 17

第二の試み:ノード

$original = "<a> 
     <b>Bat</b> 
</a>"; 
$replace = "<b>Bi</b>"; 

$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->loadXML($original); 

$xpath = new DOMXpath($dom); 
$b = $xpath->query('//b')->item(0); 

$dom2 = new DOMDocument('1.0', 'utf-8'); 
$dom2->loadXML($replace); 

$replace = $dom2->documentElement; 
$replace = $dom->importNode($replace, true); 

$dom->replaceChild($replace, $b); 

echo $dom->saveXML(); 

ERRORインポートして置き換える:

Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in /home/zital/scripts/php/dom.php:42 Stack trace:

0 /home/zital/scripts/php/dom.php(42): DOMNode->replaceChild(Object(DOMElement), Object(DOMElement))

1 {main} thrown in /home/zital/scripts/php/dom.php on line 42

答えて

1

を使用すると、1つの以上のステップはにdocumentElement

$dom->documentElement->replaceChild($replace, $b); 
を取得することはありませんでした

と結果は次のようになります

<?xml version="1.0"?> 
<a><b>Bi</b></a> 

UPD:

かなり正しいヨッシーのコメントに従い

、このような方法でこれを書いた方が良いです

$b->parentNode->replaceChild($replace, $b); 
第二の試みとの完璧な
+0

フォーク:D – ZiTAL

+0

私は最初のコードについてshureしていません。 – splash58

+1

は '$ b-> parentNode-> replaceChild(...'より良いオプションになりませんか? – Yoshi

関連する問題