删除simplexmlelement节点

时间:2012-03-10 01:23:06

标签: php xml simplexml

我有一个这种结构的xml文件

<?xml version="1.0" encoding="iso-8859-1"?>
<my_events>
                        <event id="e20111129215359">
                            <title>the title</title>
                            <channel id="1">
                                <name>A name</name>
                                <onclick></onclick>
                            </channel>
                            <event_site>
                                <name/>
                                <url/>
                            </event_site>
                            <start_date>Thu Mar 08 2012</start_date>
                            <start_time>11:00 AM</start_time>
                            <end_date>null</end_date>
                            <end_time>null</end_time>
                            <notes>Notes for the event</notes>
                        </event>
 </my_events>

要删除一个事件,我有这个php函数。

<?php

include_once("phpshared.php");

function delete_event( $nodeid ) {

    $nodes = new SimpleXMLElement('my_events.xml', LIBXML_NOCDATA, true);

    $node = $nodes->xpath("/my_events/event[@id='$nodeid']");

    $node->parentNode->removeChild($node);

    $formatted = formatXmlString($nodes->asXML());
    $file = fopen ('my_events.xml', "w"); 
    fwrite($file, $formatted); 
    fclose ($file);  

}

echo delete_event(trim($_REQUEST['nodeid']));

?>

这不会删除节点。有没有不同的方法来做到这一点?

2 个答案:

答案 0 :(得分:16)

SimpleXML允许通过PHP的unset()关键字删除元素。

对于您的代码段,只需替换

即可
$node->parentNode->removeChild($node);

if ( ! empty($node)) {
    unset($node[0][0]);
}

如果XPath查询返回了匹配的<event>元素,我们会将SimpleXML指示为unset()


除此之外:此处出现两次[0]因为:

  • xpath()返回一个数组,即使只有一个元素匹配。所以[0]用于获取该数组中的第一项,这是我们要删除的元素。
  • $node[0]返回的SimpleXMLElement表示<event>元素的集合(但是如果您访问元素/属性,则使用集合中第一个的值)。因此,我们使用[0]来获取我们要删除的实际SimpleXMLElement,这是此神奇集合中的第一个。

答案 1 :(得分:9)