【问题标题】:PHP Simple XML remove all ChildrenPHP Simple XML 删除所有子项
【发布时间】:2025-12-18 03:10:02
【问题描述】:

我想在再次填充之前从我的 xml 文件中删除所有子项(或创建更新,但这似乎更难)。所以我做的是

    $file = "data.xml";

$xml=simplexml_load_file($file);

$teller=0;
foreach( $entries as $entry ) {
foreach ($xml->xpath('//concerts') as $desc) {
    if($teller == 0)
    {
    $lol=$desc->children();
    unset($lol);
    }
    $concert = $desc->addChild( 'concert' );
    $concert->addChild( 'artist', array_shift( $entry ) );  
    $concert->addChild( 'location', array_shift( $entry ) );    
    $concert->addChild( 'date', array_shift( $entry ) );
    $teller++;
}    
}


file_put_contents($file, $xml->asXML()); 

但这并没有删除任何东西,关于我做错了什么的任何想法?

【问题讨论】:

  • @Gordon 不是重复的,添加效果很好我只想在再次开始添加之前擦除所有音乐会的孩子:)
  • 它显示创建、读取、更新和删除 (CRUD) - 不仅仅是添加。
  • @Gordon ye,但我非常希望删除所有音乐会的孩子...无法正确...布局是

标签: php xml simplexml children


【解决方案1】:

这是一种可能的解决方案 (online demo):

$xml = <<< XML
<?xml version='1.0' encoding='utf-8'?>
<concerts>
    <concert>
        <artist></artist>
        <date></date>
    </concert>
</concerts>
XML;

$concerts = simplexml_load_string($xml);

foreach ($concerts->xpath('/*/concert/*') as $child)
{
    unset($child[0]);
}

echo $concerts->asXML();

标记此 CW 是因为如何删除元素在我提供的密切投票中给出,并且此答案仅对此进行了扩展。现在已对此进行了编辑,显示the self-reference method to delete a SimpleXML element node,如问题"Remove a child with a specific attribute, in SimpleXML for PHP" 的答案中所述,这也可能是重复的。

【讨论】:

  • 休息后我想出了一个类似的解决方案 xD if($teller == 0) { while($xml->concert) { unset($xml->concert); }
  • @Toon cw 表示社区 wiki,例如我没有从中获得声誉。 unset($xml-&gt;concert) 将删除整个音乐会节点,包括子节点。我上面的解决方案只删除了任何音乐会节点的子节点。取决于你想要什么,但如果你现在想出来就好了。
【解决方案2】:

通过取消设置 $lol,您只取消了基于子项创建的变量,而不是子项本身。

查看 xPath 查询,您可能想要 unset($xml["concerts"]);

另外,我不确定是否只是因为您提供了一小段代码,但从未定义 $entries,因此您永远不会进入循环。

【讨论】:

  • 哦,是的,我已经给出了较小的版本:D 给出整件作品会很多
  • 试过 unset($xml["concerts"]);在我将文件加载到 $xml 之后也没有任何内容(添加有效,因为它不断添加到文件中:))
【解决方案3】:

您可以使用 XQuery 来完成这项工作:

let $concerts := <concerts>
    <concert>
        <artist></artist>
        <date></date>
    </concert>
</concerts>
return {
    delete node $concerts/concert/*;
    $concerts
}

您可以在http://www.zorba-xquery.com/html/demo#OLYylalXNV+ZVQbkRPVULLkd4Lo=现场试用上面的示例

有关如何安装 XQuery PHP 扩展的说明,请访问http://www.zorba-xquery.com/html/entry/2011/12/27/PHP_Meets_XQuery

【讨论】: