Я хочу удалить всех детей из моего 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());
Но это ничего не снимает, никаких идей о том, что я сделал не так?
Вот одно из возможных решений ( онлайн-демонстрация ):
$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();
с$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, и этот ответ только расширяется. И теперь это было отредактировано, показывая метод самореференции для удаления узла элемента SimpleXML, как указано в ответе на вопрос «Удалить ребенка с определенным атрибутом в SimpleXML for PHP», который также является возможным дубликатом.
Отменяя $ lol, вы только отменили переменную, созданную вами на основе детей, а не самих детей.
Глядя на запрос xPath, вы, скорее всего, захотите отменить ($ xml ["concerts"]);
Кроме того, я не уверен, что это просто потому, что вы дали небольшую часть кода, но $ entries никогда не определяется, поэтому вы никогда не войдете в цикл.
Вы можете использовать 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.