PHP, DOM — удалить первые несколько узлов

#php #xml #dom

#php #xml #dom

Вопрос:

XML-файл выглядит следующим образом:

 <newVotes>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_524700002.jpg" id="1"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_5317gg.jpg" id="2"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_5393.jpg" id="3"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_2299.jpg" id="4"/>    
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_4977.jpg" id="5"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_4977BW.jpg" id="6"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_4914.jpg" id="7"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="flowergirl.jpg" id="8"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_5393.jpg" id="9"/>
    <image details="14.10.11" path="/test/content/pictures3/" image_name="PIC_2299.jpg" id="10"/>
</newVotes>
  

Я не знаю, сколько узлов «изображения» будет содержать мой xml, и сколько из них будет удалено (это динамическая переменная количества, получаемая из модуля flash), Мой вопрос в том, как удалить, например, первые 5 узлов «изображения» в xml, используя PHP?

Особенно добавлены узлы «id», потому что я думал, что смогу как-то удалить их с помощью Xpath, но не повезло…

Спасибо за любую помощь. Артур.

Комментарии:

1. Что вы имеете в виду под «удалить»? Вы хотите создать другой файл без первых X узлов или просто отобразить все узлы, кроме первого X.

2. Если бы вы использовали один из более простых API-интерфейсов DOM-оболочки , то это так просто, как qp($xml)->find("image")->slice(0,5)->remove(); . Также проблема с вашими идентификаторами заключается в том, что им не разрешено быть числовыми.

3. @AurelioDeRosa , то, что я хочу сделать, это загрузить XML, удалить динамическое количество узлов «изображения» (например, 5 первых дочерних узлов) и сохранить изменения в XML-файле.

4. @mario , это было бы идеально, но мне не нравится иметь тонны файлов и длинный код. Я надеюсь, что это можно сделать без оберток, но если другого варианта нет, то у меня не будет выбора.

Ответ №1:

Выполнено… Это было довольно просто:

 $filesLimit = $_POST['_limit'];
$rateElement = $news_dom->getElementsByTagName('image');
$numberOfFiles = $rateElement->length;
$m = $numberOfFiles - $filesLimit   1;
if($numberOfFiles>=$filesLimit){         
    for ($i = 0; $i < $m; $i  ) {
        $nodesToRemove = $rateElement->item(0)->parentNode->removeChild($rateElement->item(0));   
    } 
}