Назначение узла произвольному узлу, как с помощью Libxml2?

Этот вопрос использует 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; 

Похожие вопросы:

  • PHP DOM заменяет элемент новым элементом
  • Вопрос PHP DOMDocument: как заменить текст узла?

Related of "Назначение узла произвольному узлу, как с помощью Libxml2?"

свойство 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();