我有 HTML表单,在提交时调用 PHP 文档post_remove.php
。 post_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" ) ;
}
?>
答案 0 :(得分:2)
仅因为属性名称为id
并不意味着DOM假定属性为 type id。根据{{3}}
要使此功能起作用,您需要使用
DOMElement::setIdAttribute
或DTD设置一些ID属性,该DTD将属性定义为ID类型。在后一种情况下,您需要在使用此功能之前使用DOMDocument::validate
或DOMDocument::$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
:,而是来自子节点的父节点。