尝试使用HTML表单使用PHP删除XML元素。元素未删除

时间:2014-09-13 04:03:00

标签: php html xml

我有 HTML表单,在提交时调用 PHP 文档post_remove.phppost_remove.php检查隐藏的输入值 value="pst_09-12-2014_07:20:11pm">,以找到与data.xml匹配的 id属性以便删除。 id="pst_01-01-2014_05:00:00pm" 我正在使用表单值进行比较。 $check = $_POST["validate"] ;

我尝试了许多替代方案,例如没有运气的循环,也觉得它们是不必要的,因为我只想删除一个元素。我似乎无法删除任何元素。

我的 HTML 表单blog_home.html

<div class="blog_wrap">
   <p>01-01-2014</p>
   <p>05:00:00pm</p>
   <h1>My first Blog</h1>
   <p>Welcome to my Blog!</p>

   <form method="post" action="post_remove.html">
      <input type="hidden" name="validate" value="pst_01-01-2014_05:00:00pm">
      <input type="submit" name="closer">
   </form>
</div>

我的 XML 文档data.xml

<?xml version="1.0" encoding="UTF-8"?>
<blog>
<posting id="pst_01-01-2014_05:00:00pm">
   <date>01-01-2014</date>
   <time>05:00:00pm</time>
   <title>My first Blog</title>
   <content>Welcome to my Blog!</content>
</posting>
<posting id="pst_02-02-2014_06:00:00pm">
   <date>02-02-2014</date>
   <time>06:00:00pm</time>
   <title>My Second Blog</title>
   <content>Welcome to my Blog!</content>
</posting>
</blog>

我的 PHP 文档post_remove.php

<?php
if ( isset( $_POST["closer"] ) )
   {
   $check = $_POST["validate"] ;

   $doc = new DOMDocument() ;
   $doc -> load( "data.xml" ) ;

   $posting = $doc -> getElementById( $check ) ;// Suspected fault.

   $doc -> removeChild( $posting ) ;
   $doc -> save( "data.xml" ) ;
   header( "Location: blog_home.html" ) ;
   }
?>

1 个答案:

答案 0 :(得分:2)

仅因为属性名称为id并不意味着DOM假定属性为 type id。根据{{​​3}}

  

要使此功能起作用,您需要使用DOMElement::setIdAttribute或DTD设置一些ID属性,该DTD将属性定义为ID类型。在后一种情况下,您需要在使用此功能之前使用DOMDocument::validateDOMDocument::$validateOnParse验证您的文档。

如果您不想创建DTD来指定@id确实是ID,您可以使用XPath表达式轻松获取属性匹配的元素。

像这样:

$doc = new DOMDocument() ;
$doc -> load( "data.xml" ) ;

$xpath = new DOMXPath($doc);

$postings = $xpath->query("/blog/posting[@id='$check']");
foreach ($postings as $posting) {
    $posting->parentNode->removeChild($posting);
}

$doc -> save( "data.xml" ) ;

注意:您也不是来自DOMDocument本身的PHP manual entry on getElementById:,而是来自子节点的父节点。