PHP Удалить узел XML по атрибуту

Пробовал множество примеров на SO, но ни один из них не работал.

Цель: удалить узел (Ед. изм) и его дочерние элементы с помощью определенного id =

filename.xml

<archive>
  <unit id = "0424670018">
    <data>Blah blah blah #1</data>
    <gdate>2018-05-28 00:42:46</gdate>
</unit>
  <unit id = "0450170018">
    <data>Blah blah blah #2</data>
    <gdate>2018-05-28 00:45:01</gdate>
  </unit>
</archive>

Используемый код, не знаю, почему он не работает при загрузке:

$id = '0450170018';
$file = 'filename.xml';
$xml = simplexml_load_string($file);

foreach($xml->archive as $fileload){
    if ($fileload->unit['@id'] == $id){
        $dom = dom_import_simplexml($fileload);
        $dom->parentNode->removeChild($dom);
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам необходимо использовать класс "DOMDocument"

$doc = new DOMDocument;
$doc->load('filename.xml');
$xml = $doc->documentElement;
$id = '0450170018';
$domNodeList = $xml->getElementsByTagname('unit'); 
foreach ( $domNodeList as $domElement ) { 

    $valueID = $domElement->getAttribute('id'); 
    if ($valueID == $id)
    {
        $xml->removeChild($domElement);
    }
}
$doc->save('filename.xml');

Будьте осторожны, getElementsByTagname() возвращает «живой» результат (он меняется, если вы изменяете DOM). Если вы удалите несколько узлов, это может работать не так, как ожидалось.

ThW 29.05.2018 19:19

@ThW Я буду удалять только один узел за раз с помощью формы удаления, публикуя $ id, так что до сих пор это было успешно. Я собираюсь протестировать и ваш код, а затем принять решение. Спасибо.

Vimmy 29.05.2018 19:29
Ответ принят как подходящий

Вы можете получить узел с помощью Xpath. Это позволяет напрямую получить соответствующие узлы.

$id = '0450170018';

$document = new DOMDocument();
$document->load('filename.xml');
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate("//unit[@id='$id']") as $unitNode) {
  $unitNode->parentNode->removeChild($unitNode);
}
$document->save('filename.xml');

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

Vimmy 29.05.2018 19:41

Другие вопросы по теме