我正在尝试通过'id'属性删除“druzenje”元素。我知道要发生这种情况,我必须从该元素中删除所有子节点。
<?xml version="1.0" encoding="utf-8"?>
<druzenja>
<druzenje id="1">
<podaci attribute="some-data"/>
</druzenje>
<druzenje id="3">
<podaci attribute="some-data"/>
</druzenje>
</druzenja>
要删除的代码是......
$druzenja = $this->dom->getElementsByTagName('druzenje');
foreach($druzenja as $node) {
if($node->getAttribute('id') == $id) {
$podaciNodeList = $node->getElementsByTagName('podaci');
foreach($podaciNodeList AS $podaciNode) {
$node->removeChild($podaciNode);
}
$this->dom->documentElement->removeChild($node);
return true;
}
}
我认为用'id'属性删除一个节点可能是糟糕的设计,但我在此基础上有很多代码,到目前为止,没有任何问题。我还有一个代码,删除以类似方式工作的“podaci”元素,它没有任何问题,但在这里它失败了。代码不会删除“podaci”和“druzenje”元素,即使removeChild()返回DomElement对象,这意味着它成功但不是。
有什么想法吗?
答案 0 :(得分:1)
$element = $this->dom->getElementById($id);
$element->parentNode->removeChild($element);
答案 1 :(得分:1)
有人杀了我我没有保存。我为浪费某人宝贵的时间而道歉。
答案 2 :(得分:1)
getElementsByTagName()返回从“DOM”中删除元素的“实时”结果。将其复制到数组以获取固定列表。
$druzenja = iterator_to_array(
$this->dom->getElementsByTagName('druzenje')
);
foreach ($druzenja as $node) {
if ($node->getAttribute('id') == $id) {
$node->parentNode->removeChild($node);
}
}
Xpath允许您使用更复杂的条件。结果不是现场。
$xpath = new DOMXpath($this->dom);
foreach ($xpath->evaluate('//druzenje[@id="'.$id.'"]') as $node) {
$node->parentNode->removeChild($node);
}