Intereting Posts
создание столбцов таблицы html, возможно, сортируемых Почему мои отладочные данные неформатированы? Запуск dir2ogg из скрипта php Как включить несколько моделей в одно представление для компонента Joomla 3.x, созданного с помощью Component Creator mb_substr отключение слов в выдержке после публикации? Laravel 5: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется Предупреждение: date () ожидает, что параметр 2 длинный, строка указана в Контрольные точки xdebug работают, но Простой Wiki Parser и Link Autodetection Как проверить xml с php Почему мне нужно запустить команду «компоновщик-автозагрузка», чтобы миграция работала в laravel Установка демонстрационного приложения Yii 2 php дезинфицирует массив с заданной функцией PHP mySQL – Когда самое лучшее время для отключения от базы данных? Не отправлять правильные данные объекта в Pusher

Как удалить элемент из дерева XML, где атрибут – это определенная строка в Simple XML PHP

Поэтому я хочу удалить дочерний элемент из строки XML, где атрибут является определенным значением.

Например:

<xml> <note url="http://google.com"> Values </note> <note url="http://yahoo.com"> Yahoo Values </note> </xml> 

Итак, как мне удалить узел примечания с атрибутом http://yahoo.com в качестве строки для URL?

Я пытаюсь сделать это в PHP Simple XML

О, а также я загружаю его как XML-объект с помощью функции SimpleXML_Load_String следующим образом:

 $notesXML = simplexml_load_string($noteString['Notes']); 

SimpleXML не имеет функции удаления дочерних узлов,
Есть случаи, когда вы можете сделать Как удалить элемент внутри строки XML?
но зависит от структуры XML

Решение в DOMDocument

 $doc = new DOMDocument; $doc->loadXML($noteString['Notes']); $xpath = new DOMXPath($doc); $items = $xpath->query( 'note[@url!="http://yahoo.com"]'); for ($i = 0; $i < $items->length; $i++) { $doc->documentElement->removeChild( $items->item($i) ); } 

Удалять узлы с помощью SimpleXML можно с помощью unset() , хотя есть некоторые обманчивы.

 $yahooNotes = $notesXML->xpath('note[@url="http://yahoo.com"]'); // We know there is only one so access it directly $noteToRemove = $yahooNotes[0]; // Unset the node. Note: unset($noteToRemove) would only unset the variable unset($noteToRemove[0]); 

Если есть несколько совпадающих узлов, которые вы хотите удалить, вы можете перебрать их.

 foreach ($yahooNotes as $noteToRemove) { unset($noteToRemove[0]); } с foreach ($yahooNotes as $noteToRemove) { unset($noteToRemove[0]); }