我有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
}
}
那么,我该怎么做呢?
答案 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) {
}
亲自尝试一下,;)