我有xml,结构是这样的
<element>
<x>
<y>
<z>Value</z>
</y>
</x>
</element>我通过这个xpath查询- //*[name()='z']选择了all <z>-tags from xml。
然后我处理每个查找节点,如果它不能满足某些要求,就需要删除整个X-tag (如果你喜欢,可以删除它的祖辈:)。
foreach ($x->query("//*[name()='z']") as $elm)
{
if ($elm !== good)
{
//need to delete whole X-tag here
}
}那么,我该怎么做呢?
发布于 2010-06-21 07:22:17
也许吧
$elm->parentNode->parentNode->parentNode->
removeChild($elm->parentNode->parentNode);顺便说一下,您可以使用
foreach ($x->query("//z") as $elm)而不是。
发布于 2010-06-21 11:48:08
我认为你把两个类的方法混在一起了。
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用于调试目的(因为我懒得在DOMDocument中编写遍历DOMNode的方法):
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) {
}自己试一试,;)
https://stackoverflow.com/questions/3081281
复制相似问题