PHP Simple XML remove all Children

青春壹個敷衍的年華 提交于 2019-12-13 17:47:00

问题


i want to remove all children from my xml file before i fill it up again (or create an update but that seemed alot harder). So what i did is

    $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()); 

But this doesn't remove anything, any ideas on what i did wrong?


回答1:


Here is one possible solution (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();

Marking this CW because how to delete elements is given in my supplied closevote and this answer only expands on this. And this now has been edited showing the self-reference method to delete a SimpleXML element node as outlined in an answer of the question "Remove a child with a specific attribute, in SimpleXML for PHP" which is also a possible duplicate.




回答2:


By unsetting $lol, you have only unset a variable you created based on the children, not the children themselves.

Looking at the xPath query, you will likely want to unset($xml["concerts"]);

Also, I'm not sure if it's just because you gave a small piece of the code, but $entries is never defined, so you would never enter the loop.




回答3:


You can use XQuery to do the job:

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

You can try the example above live at http://www.zorba-xquery.com/html/demo#OLYylalXNV+ZVQbkRPVULLkd4Lo=

Instructions on how to install the XQuery PHP extension are available at http://www.zorba-xquery.com/html/entry/2011/12/27/PHP_Meets_XQuery



来源:https://stackoverflow.com/questions/9453282/php-simple-xml-remove-all-children

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!