删除 simplexmlelement 节点

Posted

技术标签:

【中文标题】删除 simplexmlelement 节点【英文标题】:Deleting simplexmlelement node [duplicate] 【发布时间】:2012-03-27 10:31:39 【问题描述】:

我有一个这种结构的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']));

?>

这不会删除节点。有没有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

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

对于您的代码 sn-p,只需替换

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

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

如果 XPath 查询返回匹配的 &lt;event&gt; 元素,我们将 SimpleXML 指示为 unset() 它。


除此之外:这里出现了两次[0],因为:

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

【讨论】:

感谢您的回答。我选择了另一个选项,因为我希望能够将节点作为 DOM 访问。 这不是你问的问题。 @salathe 关于第二个 [0] 索引的点特别有用,而且是一个大问题。【参考方案2】:

使用unset():Remove a child with a specific attribute, in SimpleXML for PHP

【讨论】:

以上是关于删除 simplexmlelement 节点的主要内容,如果未能解决你的问题,请参考以下文章

获取 SimpleXMLElement 的 XML 内容

多维数组到多维 SimpleXMLElement(XML 对象)[重复]

如何使用 SimpleXmlElement 编写 CDATA?

如何在不使用其父级的情况下设置 SimpleXmlElement 的文本值?

php使用 SImpleXMLElement 把 xml 转为数组

让 SimpleXMLElement 在输出中包含编码