Вопреки распространенному мнению о существующих ответах, каждый узел элемента Simplexml может быть удален из документа сам по себе и unset()
. Дело в том, что вам нужно понять, как на самом деле работает SimpleXML.
Сначала найдите элемент, который вы хотите удалить:
list($element) = $doc->xpath('/*/seg[@id="A12"]');
Затем удалите элемент, представленный в $element
Вы сбросили его Самостоятельная ссылка :
unset($element[0]);
Это работает, потому что первым элементом любого элемента является сам элемент в Simplexml (ссылка на себя). Это связано с его магической природой, числовые индексы представляют элементы в любом списке (например, parent-> children), и даже один дочерний элемент является таким списком.
Нечисловые строковые индексы представляют атрибуты (в доступе к массиву) или дочерний элемент (элементы) (в доступе к свойству).
Следовательно, числовые значения при доступе к собственности, такие как:
unset($element->{0});
тоже работает.
Естественно, с этим примером xpath он довольно прост (в PHP 5.4):
unset($doc->xpath('/*/seg[@id="A12"]')[0][0]);
Полный пример кода ( Демо ):
<?php
/**
* Remove a child with a specific attribute, in SimpleXML for PHP
* @link http://stackoverflow.com/a/16062633/367456
*/
$data=<<<DATA
<data>
<seg id="A1"/>
<seg id="A5"/>
<seg id="A12"/>
<seg id="A29"/>
<seg id="A30"/>
</data>
DATA;
$doc = new SimpleXMLElement($data);
unset($doc->xpath('seg[@id="A12"]')[0]->{0});
$doc->asXml('php://output');
Выход:
<?xml version="1.0"?>
<data>
<seg id="A1"/>
<seg id="A5"/>
<seg id="A29"/>
<seg id="A30"/>
</data>