PHP - 在php中删除具有特定属性的子项[重复]

Posted

技术标签:

【中文标题】PHP - 在php中删除具有特定属性的子项[重复]【英文标题】:PHP - Remove children with a specific attribute in php [duplicate] 【发布时间】:2015-05-06 03:23:29 【问题描述】:

我们的目标是删除所有与 id 匹配的父级相同的 XML 子级。

我遇到的问题是只删除了第一个 XML 子项。当我运行这个文件时,输出是“The id is: 1”和“CarlCarlok”。该脚本删除了第一个具有“1”属性的 XML 子项。当我随后检查 XML 文件时,也证明了这一点,其中删除了 id 为“9”的评论。所以..要解决这个问题,我必须知道:

如何删除具有相同父级的每个 XML 子级? 因为现在它只删除它遇到的第一个。

<?php
require '../functions.php';

$id = $_GET['id'];
echo "The id is: " . $id . "\n";

$comment_xml_path = '../data/comments.xml';
$comments_xml_file = simplexml_load_file($comment_xml_path);

foreach ($comments_xml_file->comment as $c) 
    echo $c->author;
    if (strcmp($id, $c['parent']) == 0) 
        $dom = dom_import_simplexml($c);
        $dom->parentNode->removeChild($dom);
        echo "ok";
    
    save_xml($comment_xml_path, $comments_xml_file);

(save_xml() 是使用我们在课堂上制作的 asXML 进行保存的函数)

XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<comments>
    <comment id="6" parent="3" date="20150317224217">
         <author>Carl</author>
         <cmt>3</cmt>
    </comment>
    <comment id="9" parent="1" date="20150312225112">
         <author>Carl</author>
         <cmt>dsa</cmt>
    </comment>
    <comment id="10" parent="1" date="20150356225256">
         <author>Carl</author>
         <cmt>2</cmt>
    </comment>
    <comment id="11" parent="1" date="20150357225257">
         <author>Carl</author>
         <cmt>2</cmt>
    </comment>
</comments>

【问题讨论】:

在删除第一个匹配项后保存 XML 文件后,您在此处放置的代码将结束。其余代码未显示。所以你可能保存得太早了? 【参考方案1】:

这是SimpleXMLxpath() 的一种方式,就像SQL for XML

$id = 1; // parent
$xml = simplexml_load_file("some/path/to/an/xml/file.xml");

$comments = $xml->xpath("/comments/comment[@parent='$id']");

foreach ($comments as $comment) unset($comment[0]);

echo $xml->asXML(); // show result

评论:

第 3 行:xpath 语句将选择所有 &lt;comment&gt;,其中属性 parent = $id。语句中的@ 表示属性。条件包含在[] 中。结果作为SimpleXML 元素的array 存储在$comments 中。 第4行:删除array中的每个&lt;comment&gt;

【讨论】:

【参考方案2】:

如果你想删除所有的孩子,我会改为循环 childNodes 并调用 removeChild()

更新代码:

if (strcmp($id, $c['parent'])== 0) 
    foreach ($c->childNodes as $child) 
        $child->parentNode->removeChild($child);
    

这假设您使用的是DOMDocument。然而,你似乎把这个和SimpleXML混在一起了。

【讨论】:

你会如何在脚本中加入它? 谢谢,我试试看!

以上是关于PHP - 在php中删除具有特定属性的子项[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 php 数组中删除具有特定值的所有元素? (以尽可能最短的方式)[重复]

从 .length() 中删除特定子项 [重复]

如何从 PHP 中的多维关联数组中删除项目

检查firebase子项是不是具有特定值[重复]

排除具有特定子项的元素[重复项]

PHP - 字符串 - 删除具有特定类的 HTML 标记,包括其内容