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.

Итак, как бы я это сделал?

Вы можете использовать классы 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.

http://www.w3schools.com/Dom/dom_nodes_remove.asp

Пожалуйста, взгляните на

  • Удалите дочерний элемент с определенным атрибутом, в 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) ), потому что удаление элемента естественно уменьшает номер заказа предметов, которые появляются после него.

По общему признанию, это немного хаккаунд, но, похоже, он работает нормально.