使用PHP DOM删除XML元素时出现的问题
下面是我正在处理的XML文件:使用PHP DOM删除XML元素时出现的问题,php,xml,dom,Php,Xml,Dom,下面是我正在处理的XML文件: <list> <activity>swimming</activity> <activity>running</activity> <activity>soccer</activity> </list> 游动 跑步 足球 index.php页面显示带有复选框的活动列表、删除选中活动的按钮和添加新活动的字段: <html> <
<list>
<activity>swimming</activity>
<activity>running</activity>
<activity>soccer</activity>
</list>
游动
跑步
足球
index.php页面显示带有复选框的活动列表、删除选中活动的按钮和添加新活动的字段:
<html>
<head></head>
<body>
<?php
$xmldoc = new DOMDocument();
$xmldoc->load('sample.xml', LIBXML_NOBLANKS);
$count = 0;
$activities = $xmldoc->firstChild->firstChild;
//prints the list of activities, with checkboxes on the left for each item
//the $count variable is the id to each entry
if($activities!=null){
echo '<form name=\'erase\' action=\'delete.php\' method=\'post\'>' . "\n";
while($activities!=null){
$count++;
echo " <input type=\"checkbox\" name=\"activity[]\" value=\"$count\"/>";
echo ' '.$activities->textContent.'<br/>'."\n";
$activities = $activities->nextSibling;
}
echo ' <input type=\'submit\' value=\'erase selected\'>';
echo '</form>';
}
?>
//section used for inserting new entries. this feature is working as expected.
<form name='input' action='insert.php' method='post'>
insert activity:
<input type='text name='activity'/>
<input type='submit' value='send'/>
<br/>
</form>
</body>
</html>
加载('sample.xml',LIBXML_NOBLANKS);
$count=0;
$activities=$xmldoc->firstChild->firstChild;
//打印活动列表,左侧为每个项目的复选框
//$count变量是每个条目的id
如果($activities!=null){
回显“”。“\n”;
while($activities!=null){
$count++;
回声“;
回显“.$activities->textContent.
”。“\n”;
$activities=$activities->nextSibling;
}
回声';
回声';
}
?>
//用于插入新条目的节。此功能正在按预期工作。
插入活动:
DOMNodeList项的索引从0开始;
您需要在输出步骤中将$count++移动到while循环的末尾。除了将$count++移动到while循环的末尾之外,最好进行delete.php检查,以确保$\u POST['activity']是数字且在指定范围内,只是为了确保页面上没有生成致命错误消息。DOMNodeLists的棘手之处在于它们不是数组。如果删除节点,列表将重新编制索引。如果用户选择删除多个项目,这将导致代码中断。如果选择了游泳和跑步,游泳和足球将被删除
您可能希望首先为每个活动提供一个可以搜索的唯一标识符,比如一个名为“id”的属性(这可能不是真实的id。DOM的getElementByID()仅适用于具有DTD的XML,如HTML页面。我猜您不想去那里。)
您可以将您的XML更新为如下所示
<list>
<activity name="swimming">swimming</activity>
<activity name="running">running</activity>
<activity name="soccer">soccer</activity>
</list>
希望这能帮助您开始。我应该如何进行检查?很有趣。正如您所猜测的,正是因为DOM的重新索引,我一次删除几个条目时遇到了问题。我用一种更简单的方法解决了这个问题,我开始删除最大的id。这很有效,但你的解决方案让我想到了xpath,我来看看。我在今天尝试的一个新代码库中遇到了相同的错误。它开始让我把XML放在我最讨厌的东西上调试。
<list>
<activity name="swimming">swimming</activity>
<activity name="running">running</activity>
<activity name="soccer">soccer</activity>
</list>
$xpath = new DOMXPath($xmldoc);
$xmldoc->firstChild->removeChild($xpath->query("/list/activity[@name='$id']")->item(0));