Этот вопрос использует PHP, но проблемы и алгоритмы действительны для многих других реализаций DOM Libxml2 и W3C .
Основная проблема: нет $node->replaceThisBy($otherNode)
. Есть только «заменить текст» (используя свойство nodeValue
) и метод replaceChild()
– не obviuos, ни простой в использовании.
В приведенном ниже коде работает только второй цикл, но мне нужны копии узлов из одного дерева DOM (имитируемого клоном) на другое.
$doc = new DOMDocument('1.0', 'UTF-8'); $doc->load($fileXML); $xp = new DOMXpath($doc); $lst = $xp->query("//td"); $z = clone $lst->item(2); // a big and complex node // needs clone to freeze the node content (before change it also). // does NOT work: foreach ($lst as $node) $node = $z; // no error messages! //error: $node->parentNode->replaceChild($z,$node); // This works though: foreach ($lst as $node) $node->nodeValue = $z->nodeValue;
Похожие вопросы:
свойство nodeValue , изменяет только текстовое значение. Чтобы изменить все теги и содержимое, требуется намного больше инструкций – DomDocument не дружит (!) … Необходимо импортировать клон и клонировать в цикле: решено!
$doc = new DOMDocument('1.0', 'UTF-8'); $doc->loadXML($xmlFrag); $xp = new DOMXpath($doc); $lst = $xp->query("//p"); $import = $doc->importNode( $lst->item(1)->cloneNode(true) , TRUE); foreach ($lst as $node) { $tmp = clone $import; // clone because if same, ignores loop. $node->parentNode->replaceChild($tmp,$node); } print $doc->saveXML();