PHP – Удалить элемент XML

Мне нужно удалить элементы XML-файла с помощью PHP. Это будет сделано через ajax, и мне нужно найти элемент XML через атрибут.

Это мой XML-файл

  • как передавать неограниченные аргументы по ссылке в php
  • Синхронизированные функции в PHP
  • Что самое легкое в использовании рамки ORM для PHP?
  • Обнаружение IPv6-адреса в PHP и его правильное хранение в MySQL. Как?
  • curl: Как ограничить размер GET?
  • Неустранимая ошибка: допустимый размер памяти 268435456 байт исчерпан (пытался выделить 71 байт)
  • <?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.

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

  • Аутентификация в PHP с использованием LDAP через Active Directory
  • Отключить функции php через .htaccess
  • как сделать laravel query builder, как активная запись codeigniter
  • используя Google Docs в качестве базы данных?
  • PHP $ эта переменная
  • Как установить параметры ORDER BY с помощью подготовленной инструкции PDO?
  • 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.

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

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

    PHP is the Best Programming Language in the world.