PHP XML按名称删除元素和所有子元素

时间:2011-04-20 14:22:19

标签: php xml dom

我的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 个答案:

答案 0 :(得分:4)

DOMElement::getElementsByTagNameDOMXPath::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>

答案 1 :(得分:2)

这应该这样做:

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

您可能只是忘记了同时使用xPathgetElementsByTagName来获得列表DOMNodeList)项目。该对象本身只有一个属性$length,可用于确定列表中有多少对象,而函数item($index)则从列表中返回指定的DOMNodeDOMNodeList也可通过foreach进行迭代。 所以除了我上面写的foreach之外你还可以这样做:

for ($i = 0; $i < $featureddel->length; $i++) {
    $temp = $featureddel->item($i); //avoid calling a function twice
    $temp->parentNode->removeChild($temp);
}

foreach通常更受欢迎。

相关问题