Мне нужно удалить элементы 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.
Итак, как бы я это сделал?
Вы можете использовать классы 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 не имеет подробного способа удаления элементов, вы можете удалить элементы из 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)
), потому что удаление элемента естественно уменьшает номер заказа предметов, которые появляются после него.
По общему признанию, это немного хаккаунд, но, похоже, он работает нормально.