PHP XML удалить элемент и все дочерние по имени - PullRequest
1 голос
/ 20 апреля 2011

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

Ответы [ 2 ]

4 голосов
/ 20 апреля 2011

Оба 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>
2 голосов
/ 20 апреля 2011

Это должно сделать это:

foreach ($featureddel as $node) {
    $node->parentNode->removeChild($node);
}

Вы, вероятно, просто забываете, что с xPath и getElementsByTagName вы получаете список (DOMNodeList) предметов. Этот объект сам по себе имеет только свойство $length, которое можно использовать для определения количества объектов в списке, и функцию 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 обычно более предпочтителен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...