我的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
答案 0 :(得分:4)
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>
答案 1 :(得分:2)
这应该这样做:
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
通常更受欢迎。