删除 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 查询返回匹配的 <event>
元素,我们将 SimpleXML 指示为 unset()
它。
除此之外:这里出现了两次[0]
,因为:
xpath()
返回一个数组,即使只有一个元素匹配。所以[0]
用于获取该数组中的第一项,也就是我们要删除的元素。
从$node[0]
返回的SimpleXMLElement 表示<event>
元素的集合(但如果您访问它的元素/属性,则使用集合中第一个的值)。因此,我们使用[0]
来获取我们想要删除的实际SimpleXMLElement
,这是这个神奇集合中的第一个。
【讨论】:
感谢您的回答。我选择了另一个选项,因为我希望能够将节点作为 DOM 访问。 这不是你问的问题。 @salathe 关于第二个 [0] 索引的点特别有用,而且是一个大问题。【参考方案2】:使用unset()
:Remove a child with a specific attribute, in SimpleXML for PHP
【讨论】:
以上是关于删除 simplexmlelement 节点的主要内容,如果未能解决你的问题,请参考以下文章
多维数组到多维 SimpleXMLElement(XML 对象)[重复]
如何使用 SimpleXmlElement 编写 CDATA?
如何在不使用其父级的情况下设置 SimpleXmlElement 的文本值?