Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP DOM删除XML元素时出现的问题_Php_Xml_Dom - Fatal编程技术网

使用PHP DOM删除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> <

下面是我正在处理的XML文件:

<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));