PHP - Удалить элемент XML - PullRequest
7 голосов
/ 20 июля 2009

Мне нужно удалить элементы 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 до сих пор, и я только что понял, что он может делать все, кроме удаления элементов.

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

Ответы [ 4 ]

10 голосов
/ 20 июля 2009

Дейв Морган прав в том, что классы DOM более мощные, но если вы хотите придерживаться SimpleXML, попробуйте использовать функцию unset () на любом узле. Например. unset ($ simpleXMLDoc-> node1-> child1), и он будет удален из XML.

9 голосов
/ 20 июля 2009

Вы можете использовать классы 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 без этого узла. Если вы хотите отправить его в файл, просто напишите строку в файл.

2 голосов
/ 11 октября 2009

Несмотря на то, что в SimpleXML нет подробного способа удаления элементов, вы можете удалить элементы из SimpleXML с помощью PHP unset(). Ключом к этому является управление целевым элементом. По крайней мере, один из способов нацеливания - это порядок элементов. Сначала узнайте порядковый номер элемента, который вы хотите удалить (например, с помощью цикла), затем удалите элемент:

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

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

2 голосов
/ 20 июля 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...