Intereting Posts
Как правильно настроить соединение PDO Последовательность escape-последовательности Newline, не работающая на php php – в чем преимущество отбрасывания переменных? Прозрачно сгладить массив Интеграция Omnipay PayPal с laravel 4 Преобразование PHP-скрипта в PDO Ошибки PHP на cronjob, отлично работает при подсказке Как обращаться с PHP-переключателем с разными типами? Как диагностировать внутреннюю ошибку сервера (HTTP 500) со страницы PHP в IIS 7.5 Подтвердить json в php Как написать хорошую вставку базы данных PHP, используя ассоциативный массив Я не могу получить свою форму для подключения, чтобы правильно взаимодействовать с базой данных mySQL используя header (), чтобы переписать имя файла в URL для динамического pdf PHP DomDocument, повторное использование XSLTProcessor, стабильно / безопасно? Измените имя файла для загрузки и начните его загрузку после клика или задержки

PHP XML удаляет элемент и все дочерние элементы по имени

У меня есть 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 

Related of "PHP XML удаляет элемент и все дочерние элементы по имени"

И 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 обычно более предпочтительнее.