Удаление тегов по атрибуту 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();