PHP - 删除XML元素

时间:2009-07-20 13:49:42

标签: php xml

我需要使用PHP删除XML文件的元素。它将通过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 个答案:

答案 0 :(得分:10)

Dave Morgan的正确之处在于DOM类更强大,但如果您想坚持使用SimpleXML,请尝试在任何节点上使用unset()函数。例如。 unset($ simpleXMLDoc-&gt; node1-&gt; child1),将从XML中删除。

答案 1 :(得分:9)

您可以在PHP中使用DOM类。 (http://us3.php.net/manual/en/intro.dom.php)。

您需要将XML文档读入内存,使用DOM类进行操作,然后根据需要(http或文件)保存XML。

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 :(得分:2)

答案 3 :(得分:2)

尽管SimpleXML没有详细的方法来删除元素,但可以使用PHP的unset()从SimpleXML中删除元素。这样做的关键是管理目标所需的元素。至少一种进行定位的方法是使用元素的顺序。首先找出要删除的元素的订单号(例如使用循环),然后删除元素:

$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))进行删除,因为删除项目会自然地减少后面项目的订单号。

不可否认,这有点令人讨厌,但似乎工作正常。