用php从xml中删除整个元素

时间:2013-07-21 17:59:11

标签: php xml

是否有一种简单的方法可以修改以下php脚本以包含删除按钮 - 因此对于循环中的每个项目,当前有一个按钮来提交更改,我想添加一个按钮,只需删除元素及其孩子。

我是PHP新手,所以只是想了解如何将它与XML结合使用 - 非常感谢任何帮助。

这是php

<?php
if(isset($_GET['e'])){ //If a date is submitted, edit it
//var_dump($_GET);die;
    //Load the scores XML file
    $scores = new DOMDocument();
    $scores -> load('content.xml');

    //Get the <Games> tag
    $games = $scores -> getElementsByTagName('brand');

    //Loop through each found game
    foreach ($games as $game) {
        $child = $game->getElementsByTagName("id")->item(0);
        $oldTitle = $game->getElementsByTagName("title")->item(0);
        $oldScore = $game->getElementsByTagName("schedule_date")->item(0);
        $oldRow = $game->getElementsByTagName("image")->item(0);
        $id = $child->nodeValue;
        if($id==$_GET['e']){ //The date is the date asked for.
            $game -> replaceChild($scores -> createElement("title", $_GET['title']),$oldTitle);
            $game -> replaceChild($scores -> createElement("schedule_date", $_GET['schedule_date']),$oldScore);
            $game -> replaceChild($scores -> createElement("image", $_GET['image']),$oldRow);
        }
    }

    //Save again
    $scores -> save('content.xml');
}
?>
<hr>
<?php
//Load the scores XML file
$scores = new DOMDocument();
$scores -> load('content.xml');

//Get the <Games> tag
$games = $scores -> getElementsByTagName('brand');

//Loop through each game
foreach ($games as $game) {
    //Print each with an edit link.
    $id = $game->getElementsByTagName("id")->item(0)->nodeValue;
    $title = $game->getElementsByTagName("title")->item(0)->nodeValue;
    $score = $game->getElementsByTagName("schedule_date")->item(0)->nodeValue;
    $row = $game->getElementsByTagName("image")->item(0)->nodeValue;
    echo '<h3>'.$id . '</h3>
    <form method="get" action="">
        <input type="hidden" name="e" value="'.$id.'">
        Title: <input type="text" value="'.$title.'" name="title"><br>
        Score: <input type="text" value="'.$score.'" name="schedule_date"><br>
        Row: <input type="text" value="'.$row.'" name="image"><br>
        <input type="submit" value="edit">
    </form>
    <hr>';
}
?>

这是示例xml

<brand>
<title></title>
<schedule_date></schedule_date>
<image></image>
</brand>

1 个答案:

答案 0 :(得分:0)

制作表格:

  <form method="get" action="">
    <input type="hidden" name="e" value="'.$id.'">
    Title: <input type="text" value="'.$title.'" name="title"><br>
    Score: <input type="text" value="'.$score.'" name="schedule_date"><br>
    Row: <input type="text" value="'.$row.'" name="image"><br>
    <input type="submit" value="edit">
  </form>
  <form method="post" action="">
     <input type="hidden" name="deleteid" value="'.$id.'">
     <input type="submit" name="action" value="delete">
  </form>

使用表格:

if(isset($_POST['action']) && $_POST['action']=='delete'){
   $scores = new DOMDocument();
   $scores -> load('content.xml');
   $xpath = new DOMXPath($scores);

   //you might want to clean up the $_POST['deleteid'], i don't know what's valid:
   $id = preg_replace('/[^a-z0-9]/i','',$_POST['deleteid']);

   //Searching nodes in DOM is best handled in xpath (unless getElementById() works)
   $search = $xpath->query('//id[.="'.$id.'"]/ancestor::game'); //use '/../'  if direct child

   if($search->length = 1){ //0 is not found, > 1 is multiple nodes!
       $deleteNode = $search->item(0);
       //this is the DOM way of deleting an item.
       $deleteNode->parentNode->removeChild($deleteNode);
   }
   $scores->save('content.xml');
}