Рассмотрим следующий код:
$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(); ?>