删除除分支以外的所有DOM儿童PHP

问题描述:

我有一个DOM(结构无关)。删除除分支以外的所有DOM儿童PHP

<g> 
    <svg> 
     <g><path/></g> 
     <g><circle/></g> 
    </svg> 
</g> 

我需要删除所有没有path元素的svg子元素。

jQuery中:

$("g > svg > g:not(path)").remove();

+0

这似乎是一个很好的JavaScript答案,但要小心;这无助于提问者(这可能是为什么它被低估)。请注意,他们用PHP标记了这个问题,所以他们正在寻找一种方法在PHP中实现这一点。 –

您可以使用此XPath表达式:

//svg[not(.//path)] 

这将让所有svg元素没有path后裔。

您还可以使用

//svg/*[not(.//path)] 

只得到svg元素是不属于path实际的孩子。

然后,只需从XML删除所有比赛:

$dom = new DOMDocument(); 
$dom->loadXML($doc); 
$x = new DOMXPath($dom); 
$toDelete = $x->query("//svg[not(.//path)]"); 
foreach ($toDelete as $child) { 
    $child->parentNode->removeChild($child); 
} 
var_dump($dom->saveXML()); 

Demo

编辑从路径元素改为不带路径元素,感谢@ splash58的抬起头

+0

svg children not have path ='$ toDelete = $ x-> query(“// svg/* [not(.// path)]”);' – splash58

+0

废话,我误解了这个问题。编辑它,感谢@ splash58! – ishegg

+0

儿童 - svg'/*' – splash58