Поэтому я хочу удалить дочерний элемент из строки 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]); }