PHP Simple XML удалить всех детей - PullRequest
1 голос
/ 26 февраля 2012

Я хочу удалить всех детей из моего 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 ]

4 голосов
/ 26 февраля 2012

Вот одно из возможных решений ( онлайн-демонстрация ):

$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, и этот ответ только расширяется на этом. И теперь это было отредактировано, показывая метод self-reference для удаления узла элемента SimpleXML , как обрисовано в общих чертах в ответе на вопрос "Удалить потомка с помощью специфический атрибут в SimpleXML для PHP ", который также является возможным дубликатом.

1 голос
/ 26 февраля 2012

Сбрасывая $ lol, вы отменяете только переменную, созданную на основе дочерних элементов, а не самих дочерних элементов.

Глядя на запрос xPath, вы, вероятно, захотите сбросить его ($ xml ["концерты"]);

Кроме того, я не уверен, что это только потому, что вы дали небольшой фрагмент кода, но $ entry никогда не определяется, поэтому вы никогда не войдете в цикл.

0 голосов
/ 27 февраля 2012

Вы можете использовать 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

...