PHP – Удалить элемент XML
Мне нужно удалить элементы XML-файла с помощью PHP. Это будет сделано через ajax, и мне нужно найти элемент XML через атрибут.
Это мой XML-файл
<?xml version="1.0" encoding="utf-8"?> <messages> <message time="1248083538"> <name>Ben</name> <email>Ben's Email</email> <msg>Bens message</msg> </message> <message time="1248083838"> <name>John Smith</name> <email>john@smith.com</email> <msg>Can you do this for me?</msg> </message> </messages>
Так что я бы сказал, это что-то вроде удаления элемента, где время равно 1248083838.
До сих пор я использовал Simple XML, и я только что понял, что он может делать все, кроме элементов delete.
Итак, как бы я это сделал?
5 Solutions collect form web for “PHP – Удалить элемент XML”
Вы можете использовать классы DOM в PHP. ( http://us3.php.net/manual/en/intro.dom.php ).
Вам нужно будет прочитать XML-документ в памяти, использовать классы DOM для манипуляции, а затем вы можете сэкономить XML по мере необходимости (до http или файла).
DOMNode – это объект, в котором есть функции удаления (для решения вашего вопроса).
Это немного сложнее, чем SimpleXML, но как только вы привыкнете к этому, он намного эффективнее
(полу-взятый из примера кода на php.net)
<?php $doc = new DOMDocument; $doc->load('theFile.xml'); $thedocument = $doc->documentElement; //this gives you a list of the messages $list = $thedocument->getElementsByTagName('message'); //figure out which ones you want -- assign it to a variable (ie: $nodeToRemove ) $nodeToRemove = null; foreach ($list as $domElement){ $attrValue = $domElement->getAttribute('time'); if ($attrValue == 'VALUEYOUCAREABOUT') { $nodeToRemove = $domElement; //will only remember last one- but this is just an example :) } } //Now remove it. if ($nodeToRemove != null) $thedocument->removeChild($nodeToRemove); echo $doc->saveXML(); ?>
Это должно дать вам немного идеи о том, как удалить элемент. Он будет печатать XML без этого узла. Если вы хотите отправить его в файл, просто напишите строку в файл.
Дейв Морган прав, поскольку классы DOM более мощные, но если вы хотите придерживаться SimpleXML, попробуйте использовать функцию unset () на любом узле. Например, unset ($ simpleXMLDoc-> node1-> child1), и это будет удалено из XML.
вы должны иметь возможность удалять узлы через функции DOM.
Пожалуйста, взгляните на
- Удалите дочерний элемент с определенным атрибутом, в SimpleXML для PHP на SO
- Удаление узлов в SimpleXMLElement
Несмотря на то, что SimpleXML не имеет подробного способа удаления элементов, вы можете удалить элементы из SimpleXML с помощью функции unset()
PHP. Ключом к этому является управление целевым элементом. По крайней мере, один из способов сделать таргетинг – это порядок элементов. Сначала найдите номер заказа элемента, который вы хотите удалить (например, с помощью цикла), затем удалите элемент:
$target = false; $i = 0; foreach ($xml->message as $m) { if ($m['time']=='1248083838') { $target = $i; break; } $i++; } if ($target !== false) { unset($xml->message[$target]); }
с$target = false; $i = 0; foreach ($xml->message as $m) { if ($m['time']=='1248083838') { $target = $i; break; } $i++; } if ($target !== false) { unset($xml->message[$target]); }
Вы можете даже удалить несколько элементов с помощью этого, сохранив номер заказа целевых элементов в массиве. Не забудьте сделать удаление в обратном порядке ( array_reverse($targets)
), потому что удаление элемента естественно уменьшает номер заказа предметов, которые появляются после него.
По общему признанию, это немного хаккаунд, но, похоже, он работает нормально.