我有一个这种结构的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>
Run Code Online (Sandbox Code Playgroud)
要删除一个事件,我有这个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']));
?>
Run Code Online (Sandbox Code Playgroud)
这不会删除节点.有没有不同的方法来做到这一点?
sal*_*the 18
SimpleXML允许通过PHP的unset()关键字删除元素.
对于您的代码段,只需替换即可
$node->parentNode->removeChild($node);
Run Code Online (Sandbox Code Playgroud)
同
if ( ! empty($node)) {
unset($node[0][0]);
}
Run Code Online (Sandbox Code Playgroud)
如果XPath查询返回了匹配<event>元素,我们会向unset()它指示SimpleXML .
旁白:这里有两次[0]因为:
xpath()返回一个数组,即使只有一个元素匹配.因此[0]用于获取该数组中的第一项,这是我们要删除的元素.$node[0]表示<event>元素的集合(但是如果访问元素/属性,则使用集合中第一个的值).所以,我们用来[0]实现SimpleXMLElement我们想删除的实际内容,这是这个神奇集合中的第一个.