#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));
}
}