Intereting Posts
Получить HTML со страницы после POST Ошибка при выполнении ассемблерного дампа (ошибка синтаксического анализа: сбой в `&: extend (.clearfix all);`) Recaptcha – настройка формы PHP / MySQL: получить один путь в модели списка Adjacency Назначение параметров PHP Использует htmlspecialchars () для обработки HTML-данных для ввода-вывода, для плохой конструкции базы данных MySQL? PHP хранения нескольких целых переменных в 1 переменную? Извлечение URL из текста в PHP WordPress объединяет запросы Регулярное выражение (RegEx) для телефонных номеров с проверкой кода страны Ошибка Количество столбцов не совпадает со значением в строке 1? Как выполнить поиск символа в любом порядке (12 букв, из которых 6 должно быть слово) с PHP? Netcat запускает отправку двоичных данных в php-скрипт Массив, содержащий ключи и ассоциативный массив, как сделать соотношение Как эффективно использовать try … catch блоки в PHP

DOM replaceChild не заменяет все указанные элементы

Рассмотрим следующий код:

$xml = <<<XML <root> <region id='thisRegion'></region> <region id='thatRegion'></region> </root> XML; 

 $partials['thisRegion'] = "<p>Here's this region</p>"; $partials['thatRegion'] = "<p>Here's that region</p>"; $DOM = new DOMDocument; $DOM->loadXML($xml); $regions = $DOM->getElementsByTagname('region'); foreach( $regions as $region ) { $id = $region->getAttribute('id'); $partial = $DOM->createDocumentFragment(); $partial->appendXML( $partials[$id] ); $region->parentNode->replaceChild($partial, $region); } echo $DOM->saveXML(); 

Выход:

 <root> <p>Here's this region</p> <region id="thatRegion"/> </root> 

Я не могу за всю жизнь понять, почему все теги региона не заменяются. Это проблема в моем проекте, и сначала я думал, что это не замена элементов, которые я добавил после loadXML, но с некоторыми экспериментами я не смог сузить шаблон здесь.

Я был бы признателен за исправление кода, чтобы разрешить мне заменять все теги в DOMDocument заданным Element Node. Я также не буду возражать против ввода более эффективного / практического способа выполнить это, если я его не найду.

Заранее спасибо!

[править] PHP 5.3.13

NodeLists живут. Поэтому, когда вы удаляете элемент внутри документа, NodeList также будет изменен. Избегайте использования ссылки на NodeList и начинайте замену на последнем элементе:

 $DOM = new DOMDocument; $DOM->loadXML($xml); $regions = $DOM->getElementsByTagname('region'); $regionsCount = $DOM->getElementsByTagName('region')->length; for($i= $regionsCount;$i>0;--$i) { $region=$DOM->getElementsByTagName('region')->item($i-1); $id = $region->getAttribute('id'); $partial = $DOM->createDocumentFragment(); $partial->appendXML( $partials[$id] ); $region->parentNode->replaceChild($partial, $region); } echo $DOM->saveXML(); ?> 

http://codepad.org/gTjYC4hr