Intereting Posts
Group By и отображение записей на дату загрузить значения sql-таблицы для повторного использования в офлайн-режиме Раздутый PDF, созданный TCPDF Как анализировать URL-адрес Zend для параметров? PHP новый разрыв строки в сообщениях электронной почты Использование регулярного выражения subpattern to вместо использования регулярного выражения 2 раза в php Задайте каталог PHP ImageMagick tmp PHP Несериализуйте ошибку смещения CodeIgniter не работает с многоуровневыми подпапками для обоих контроллеров и представлений Эффективный способ сохранения массива и его ключей в базе данных обновление cakephp с 1,3 до 2 аутентификации SimpleXML сохраняет возвращаемый контент на элементе CDATA Может ли кто-нибудь предложить лучший сценарий изменения размера изображения в php? Внедрение оценки объектов выражения типа goMongoDB Почему ошибка в кодеригере не регистрируется?

Использование DOMXPath для замены узла при сохранении его положения

Итак, у меня была эта аккуратная небольшая идея, чтобы создать вспомогательный класс для DOMDOCUMENT, который в какой-то мере имитирует способность jQuery манипулировать DOM строки HTML или XML. Вместо селекторов css используется XPath. Например:

$Xml->load($source) ->path('//root/items') ->each(function($Context) { echo $Context->nodeValue; }); 

Это вызовет функцию обратного вызова на каждом результирующем узле. К сожалению, PHP версия <5.3.x не поддерживает лямбда-функции или закрытие, поэтому я вынужден сделать что-то еще более похожее на это:

 $Xml->load($source) ->path('//root/items') ->walk('printValue', 'param1', 'param2'); 

В настоящий момент все работает отлично, и я думаю, что этот проект был бы полезен для многих людей, но я застрял в одной из функций. Я пытаюсь воспроизвести метод «replace» jQuery. Используя следующий код, я могу сделать это довольно легко, применяя следующий метод:

 $Xml->load($source) ->path('//root/items') ->replace($Xml->createElement('foo', 'bar')); // can be an object, string or XPath pattern 

Код этого метода:

 public function replace($Content) { foreach($this->results as $Element) { $Element->parentNode->appendChild($Content->cloneNode(true)); $Element->parentNode->removeChild($Element); } return $this; } 

Теперь это работает. Он заменяет каждый результирующий элемент клонированной версией $ Content. Проблема в том, что она добавляет их в конец списка дочерних узлов родительского узла. Вопрос в том, как мне клонировать этот элемент для замены других элементов, сохраняя при этом исходное положение в DOM?

Я думал об обратном проектировании узла, который я должен был заменить. В принципе, копирование значений, атрибутов и имени элемента из $ Content, но я не могу изменить фактическое имя элемента целевого элемента.

Отражение может быть возможным, но есть лучший способ сделать это.

Кто-нибудь?