在开始之前,请注意我对此很新。
我有一个日历,我最终希望用户能够使用PHP通过HTML表单添加,编辑和删除存储在XML文件中的事件。到目前为止,由于本网站上的提示,我已设法添加,但我很难删除。
我希望用户能够输入他们想要删除的事件的名称,以便可以在xml文件中找到并删除它。
问题在于,当我输入要删除的事件时,表单只会按照输入的相反顺序删除事件,似乎是从xml文件的底部开始的。
例如: 通过HTML表单,我输入4个事件。活动1,活动2,活动3,活动4。
假设我要删除事件2.我使用删除表单删除事件2,但事件4被删除。所以我再次尝试删除事件2,这次事件3被删除。
非常感谢任何帮助!
非常感谢。
这就是我所拥有的:
XML
<calendar>
<event>
<name>Event 1</name>
<startdate>21-3-2016</startdate>
<enddate></enddate>
<starttime>14.41</starttime>
<endtime></endtime>
</event>
</calendar>
HTML
<form action="remove.php" method="post" name="remove" id="calendarEdit">
<input class="calendarInput" type="text" name="name" id="name">
<input type="submit" name="button" id="button" value="Delete">
</form>
Remove.php
$name = $_POST['name'];
$xml = new DOMDocument('1.0', 'utf-8');
$xml-> load('events.xml' ) ;
$xpath = new DOMXPath($xml);
foreach ($xpath->query("/calendar/event['name']") as $node);
{
$node->parentNode->removeChild ($node);
}
$xml->formatoutput - true;
$xml->save('events.xml');
header('Location: calendar.html');
exit();
答案 0 :(得分:0)
您的代码:
foreach ($xpath->query("/monthly/event['name']") as $node);
{
$node->parentNode->removeChild ($node);
}
你有一个拼写错误,即foreach
声明末尾的分号。通过这种方式,您的代码意味着:
foreach ($xpath->query("/monthly/event['name']") as $node)
{
}
$node->parentNode->removeChild ($node);
因此,您的foreach()
除了更新$node
内容之外别无其他。然后,->removeChild()
删除实际的$node
(最后一个孩子)。
您的XPath查询也是错误的。要使用“事件1”值搜索<name>
个节点,您必须创建如下模式:
/calendar/monthly/event/name[text() = "Event 1"]
请注意,模式开头的/
用于从根元素开始搜索完整树,因此您必须使用完整的后代树(我从{{1开始)基于你的例子)。
如果要执行忽略元素位置的搜索,则必须使用calendar
。因此,如果您想从//
项目开始搜索“事件1”,那么您的模式是:
<monthly>
最后但并非最不重要:要删除“事件1”,您不需要foreach循环,只需尝试:
//monthly/event/name[text() = "Event 1"]
模式的$nodes = $xpath->query( '//monthly/event[name[text() = "Event 1"]]' );
$nodes->item(0)->parentNode->removeChild( $nodes->item(0) );
部分表示:检索event[name[text() = "Event 1"]]
元素,其中<event>
子项的值为“事件1”。