У меня есть XML-файл, структурированный как:
<root> <featured> <title></title> <tweet></tweet> <img></img> </featured> </root>
Элемент добавляется динамически, пользователю нужна опция удаления элемента в определенных случаях,
Я пробовал несколько вариантов кода, включая:
$featureddel = $xpath->query('//featured'); while ( $featureddel->hasChildNodes()){ $featureddel->removeChild($featureddel->childNodes->item(0)); }
что дает мне ошибку:
PHP Fatal error: Call to undefined method DOMNodeList::hasChildNodes()
Я также пытался:
$featureddel= $dom->getElementsByTagName('featured'); $featureddel->parentNode->removeChild($featureddel);
который возвращает:
PHP Fatal error: Call to a member function removeChild() on a non-object
И DOMElement::getElementsByTagName
и DOMXPath::query
возвращают DOMNodeList
. Кажется, что ваш код ожидает единственного DOMNode
. Попробуй это:
$featureddel = $xpath->query('//featured'); // OR: // $featuredde1 = $dom->getElementsByTagName('featured'); foreach ($featuredde1 as $node) { $node->parentNode->removeChild($node); }
Изменить : этот точный код работает так, как ожидалось для меня (PHP 5.3, Debian Squeeze):
<?php $xml = '<root> <featured> <title></title> <tweet></tweet> <img></img> </featured> </root>'; $dom = new DOMDocument(); $dom->loadXML($xml); $featuredde1 = $dom->getElementsByTagName('featured'); foreach ($featuredde1 as $node) { $node->parentNode->removeChild($node); } echo $dom->saveXML();
Выход:
<?xml version="1.0"?> <root> </root>
Это должно сделать это:
foreach ($featureddel as $node) { $node->parentNode->removeChild($node); }
Вероятно, вы просто забываете, что с xPath
и getElementsByTagName
вы получаете список ( DOMNodeList
) элементов. Сам объект имеет свойство $length
, которое можно использовать для определения количества объектов в списке и item($index)
функции item($index)
, который возвращает указанный DOMNode
из списка. DOMNodeList
также можно итератировать через foreach
. Таким образом, помимо foreach
как я писал выше, вы также можете сделать:
for ($i = 0; $i < $featureddel->length; $i++) { $temp = $featureddel->item($i); //avoid calling a function twice $temp->parentNode->removeChild($temp); }
Но foreach
обычно более предпочтительнее.