php - 删除 simplexmlelement 节点

标签 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']));

?>

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

最佳答案

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我们要删除的,这是这个神奇集合中的第一个。

关于php - 删除 simplexmlelement 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9643116/

相关文章:

php - 换行符在 textarea 中显示为\r\n

xml - 什么时候 XSLT 是定义 XML 转换而不是使用像 Python 这样的脚本语言的适当解决方案?

sql - 使用 SQL Server 2005 XML API 规范化 XML 片段

php - 如何在带有嵌套数组和对象的 php 中使用递归函数?

php - SQL 查询 onsubmit - 更改现有结果

php - 无法从 Laravel 应用程序内部向 Paypal Connect 发送 POST 请求

php - 无法使用jquery和ajax删除多个用户(codeigniter 3)

java - 将 Soap XML 响应转换为对象

php - 调用未定义函数 simplexml_load_file()

PHP-MYSQL : update mysql from xml file