【发布时间】:2012-01-26 13:48:48
【问题描述】:
我有一个相当复杂的 XML 文档,我需要使用 PHP / SimpleXML 删除特定节点。我不确定我会在文档中找到它们的深度。
它的工作原理如下: 用户插入了一些我需要删除的元素的 ID。 (这些 ID 指的是一个属性。)这是一个简化的示例 XML 文件:
<?xml version="1.0"?>
<root>
<firstlayer>
<secondlayer>
<thirdlayer>
<element id="1"/>
<element id="2"/>
<element id="3"/>
</thirdlayer>
<thirdlayer>
<element id="4"/>
<element id="5"/>
</thirdlayer>
</secondlayer>
</firstlayer>
</root>
我不知道当我必须删除元素时它们会在哪里,所以我写了一个遍历 XML 文档的递归函数:
function traverseNodes($node) {
foreach($node->children() as $child) {
if($child->getName()=="element") {
// Code for finding out if node has to be deleted
if(deleteMe) {
$dom = dom_import_simplexml($child);
$dom->parentNode->removeChild($dom);
} else {
traverseNodes($child); // visit the children
}
}
else {
// do some other stuff with the rest of the nodes
// and recursively call the function
}
}
}
这个函数从根节点开始,访问所有的子节点。当遇到必须删除的节点时,它会使用 DOM 结构将其删除……但问题是:它只删除父节点的第一个兄弟节点。因此,当我想从上一个 XML 文档中删除元素 1、3 和 5 时,它只会删除 1 和 5(因为它们是各自父元素中最先被删除的元素。
我不确定问题是什么。已经考虑过销毁$child对象,所以foreach-loop不能继续了,但是前后两行是一样的
$dom = dom_import_simplexml($child);
$dom->parentNode->removeChild($dom);
如果有任何想法,我将不胜感激......
【问题讨论】:
-
使用XPath