PHP - XML ​​öğesi silme

5 Cevap php

Ben PHP kullanarak bir XML dosyasının öğelerini silmeniz gerekir. Bu ajax yapılacaktır ve ben bir niteliği yoluyla XML öğesi bulmalıyız.

Bu benim XML dosyası

<?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>

Yani ne söyleyebilirim zaman 1248083838 eşittir elemanı silmek gibi bir şeydir.

Şimdiye kadar basit XML kadar kullanarak ive ve ben sadece silme unsurları hariç her şeyi yapabilirsiniz fark ettik.

Peki bunu nasıl yapardın?

5 Cevap

Siz PHP DOM sınıfları kullanabilirsiniz. (http://us3.php.net/manual/en/intro.dom.php).

Sen, belleğe XML belgesini okumak gerekir manipülasyon yapmak için DOM sınıfları kullanın, ve sonra gerektiği gibi (http veya dosya) XML dışarı kaydedebilirsiniz olacaktır.

DOMNode (sorunuzu adres) özellikleri kaldırmak olan orada bir nesnedir.

Bu biraz daha karmaşık SimpleXML fazla ama buna alışmak, çok daha güçlü

(Php.net bir örnek kod yarı-taken)

<?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(); 
?>

Bu size öğe kaldırmak için nasıl bir fikir biraz vermelidir. O düğüm olmadan XML yazdırılacaktır. Eğer dosyaya göndermek istedi, sadece dosya dize yazmak.

Bu DOM sınıfları daha güçlü, ama SimpleXML ile sopa istiyorum durumda, herhangi bir düğüme unset () fonksiyonunu kullanarak deneyin Dave Morgan doğrudur. Örneğin unset ($ simpleXMLDoc-> Düğüm1-> child1), ve bu XML silinecektir.

Eğer DOM fonksiyonları ile düğümleri kaldırmak gerekir.

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

SimpleXML öğeleri kaldırmak için ayrıntılı bir yol yok olsa bile, can PHP'nin unset() ile SimpleXML öğeleri kaldırın. Bunu yapmanın anahtarı istenilen elemanı hedef yönetiyor. Hedefleme yapmak için en az bir yol elemanları sırasını kullanıyor. Önce (bir döngü ile örneğin) kaldırmak istediğiniz elemanın sıra numarasını bulmak, ardından elemanı kaldırın:

$target = false;
$i = 0;
foreach ($xml->message as $m) {
  if ($m['time']=='1248083838') { $target = $i; break; }
  $i++;
}
if ($target !== false) {
  unset($xml->message[$target]);
}

Hatta bir dizi hedef öğeleri sipariş numarası depolayarak, bu birden çok öğeleri kaldırabilirsiniz. Sadece doğal bir öğeyi kaldırmak ondan sonra gelip öğelerin sırası sayısını azaltır (array_reverse($targets)), çünkü bir ters sırayla kaldırma yapmayı unutmayın.

Kuşkusuz, bu bir hackaround biraz, ama ince iş gibi görünüyor.