Удаление тегов по атрибуту XML

Есть xml:

<?xml version="1.0"?>
<Directory>
<DirectoryEntry name="sasha123">
<Name>Sasha123</Name>
<Mobile>3214653</Mobile>
</DirectoryEntry>
<DirectoryEntry name="sasha567">
<Name>Sasha567</Name>
<Mobile>54867</Mobile>
</DirectoryEntry>
<DirectoryEntry name="sasha158">
<Name>Sasha1342</Name>
<Mobile>54867</Mobile>
</DirectoryEntry>
</Directory>

Нужно удалить DirectoryEntry с атрибутом " name = "sasha123" " используя php. Самому не получилось, нашел код в интернете с simpleXML но постоянно выводит ошибки:

<?php
$xml = simplexml_load_file('../contact.xml');

$del_items = [];
foreach ($xml as $e) {
 $attr = $e->DirectoryEntry->attributes();
 if ($attr && $attr['class'] != 'sasha123') {
   $del_items []= $e;
 } else{
     echo 'not';
 }
}

foreach ($del_items as $e) {
 $dom = dom_import_simplexml($e);
 $dom->parentNode->removeChild($dom);
}

echo $xml->asXML();
?>

Желаемый результат:

<Directory>
<DirectoryEntry name="sasha567">
<Name>Sasha567</Name>
<Mobile>54867</Mobile>
</DirectoryEntry>
<DirectoryEntry name="sasha158">
<Name>Sasha1342</Name>
<Mobile>54867</Mobile>
</DirectoryEntry>
</Directory>

Спасибо.


Ответы (1 шт):

Автор решения: splash58

в данном случае нет смысла использовать сразу обе библиотеки - и simpleXML, и DomDocument.

можно сразу загрузить в Dom и найти элементы для удаления с помощью xpath

$dom = new DOMDocument();
$dom->loadXML($s);

$root = $dom->documentElement;

$xp = new DOMXPath($dom);
// найдем всех саш 123
$del = $xp->query('//DirectoryEntry[@name="sasha123"]', $root);
// и удалим их
foreach($del as $e) {
    $root->removeChild($e);
}

echo '<pre>' . $dom->saveXML();
→ Ссылка