删除节点的父节点

时间:2010-06-20 23:18:33

标签: php xml

我有xml,结构如下

<element>
    <x>
        <y>
            <z>Value</z>
        </y>
    </x>
</element>

我通过此xpath查询选择xml中的所有<z> - 标记 - //*[name()='z']

然后我处理每个发现节点,如果不满意某些要求需要删除整个X-tag(祖父母,如果你愿意:)。)

foreach ($x->query("//*[name()='z']") as $elm)
{

if ($elm !== good)
{

//need to delete whole X-tag here

}


}

那么,我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

也许

$elm->parentNode->parentNode->parentNode->
    removeChild($elm->parentNode->parentNode);

顺便说一下,你可以使用

foreach ($x->query("//z") as $elm)

代替。

答案 1 :(得分:0)

我认为你们正在混淆两个班级的方法。

SimpleXMLElement::removeChild不存在(它是DOMNode的一部分)。遗憾的是,DOMDocument::xpath也不存在,因此如果不修改代码,就不能使用任何一个。

我之所以选择DOMDocument,是因为DOM选择的简单性(只需要标签名称旁边的元素),这是我的结果:

<?php

    $bad = 'Value';
    $doc = DOMDocument::load('./xpath_del.xml') or die('Failed parsing XML');
    $x   = $doc->getElementsByTagName('x');

    for ($i = 0; $i < $x->length; ++$i) {
        $z = $x->item($i)->getElementsByTagName('z');
        for ($j = 0; $j < $z->length; ++$j) {
            if ($bad === $z->item($i)->nodeValue) {
                $x->item($i)->parentNode->removeChild($x->item($j));
                break;
            }
        }
    }

?>

所以,使用转换为SimpleXMLElement进行调试(因为我懒得编写一个方法来遍历DOMNode中的DOMDocument):

var_dump(simplexml_import_dom($doc));

输出DOMDocument结构之前和之后。请记住,如果这是针对高流量网站的,我绝对建议不要留下这个调试代码(但这可能对您没有关系)。

无论如何,以下是以前的结果:

object(SimpleXMLElement)#2 (1) {
  ["x"]=>
  object(SimpleXMLElement)#3 (1) {
    ["y"]=>
    object(SimpleXMLElement)#4 (1) {
      ["z"]=>
      string(5) "Value"
    }
  }
}

之后:

object(SimpleXMLElement)#5 (0) {
}

亲自尝试一下,;)