PHP Simple XML删除所有Children

时间:2012-02-26 13:01:42

标签: php xml simplexml children

我希望在再次填充之前从我的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()); 

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

3 个答案:

答案 0 :(得分:4)

以下是一种可能的解决方案(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是因为我提供的closevote中给出了如何删除元素,这个答案只对此进行了扩展。现在已根据问题the self-reference method to delete a SimpleXML element node的回答中所述的"Remove a child with a specific attribute, in SimpleXML for PHP"进行了编辑,这也是一个可能重复的内容。

答案 1 :(得分:1)

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

查看xPath查询,您可能想要取消设置($ xml [“concerts”]);

另外,我不确定是不是因为你提供了一小部分代码,但是从未定义$ entries,所以你永远不会进入循环。

答案 2 :(得分:0)

您可以使用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=

上尝试上面的示例

http://www.zorba-xquery.com/html/entry/2011/12/27/PHP_Meets_XQuery

提供了有关如何安装XQuery PHP扩展的说明