我希望在再次填充之前从我的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());
但这并没有删除任何东西,对我做错了什么想法?
答案 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扩展的说明