【问题标题】:Trying to remove XML element with PHP using an HTML form. Element not removed尝试使用 HTML 表单使用 PHP 删除 XML 元素。元素未移除
【发布时间】:2023-03-23 11:46:01
【问题描述】:

我有一个 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" ) ;
   }
?>

【问题讨论】:

  • 旁注:您的操作显示action="post_remove.html",但您的文件是post_remove.php - 它应该是action="post_remove.php"
  • @Fred -ii-oops 转移错误。
  • 为什么在删除节点的上方有一个标头重定向?您删除节点,然后在完成后重定向
  • @Ghost 我想知道这一点。谢谢你的提示。我真的觉得它应该放在第一位。
  • @Xavier 实际上我试图回答你的问题,但也失败了,但我发现你不能在 XMLs 上使用 getElementById,这里有一个 reading 关于它,如果它是,唯一提出的解决方案是通过 XPath

标签: php html xml


【解决方案1】:

仅仅因为属性名称是id 并不意味着 DOM 假定属性是 type id。根据PHP manual entry on getElementById:

要使此功能起作用,您需要使用DOMElement::setIdAttribute 设置一些ID 属性或将属性定义为ID 类型的DTD。在后一种情况下,您需要在使用此功能之前使用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" ) ;

注意:remove the child 也不是来自 DOMDocument 本身,而是来自子节点的父节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多