xml删除php中的子节点

时间:2014-02-02 09:38:42

标签: php xml

我正在尝试通过'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对象,这意味着它成功但不是。

有什么想法吗?

3 个答案:

答案 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);
}