【问题标题】:Remove multiple sibling nodes from XML document with PHP SimpleXML使用 PHP SimpleXML 从 XML 文档中删除多个兄弟节点
【发布时间】: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);

如果有任何想法,我将不胜感激......

【问题讨论】:

标签: php xml simplexml


【解决方案1】:

假设你的 XML 在 $xmlString 中,你可以使用类似的东西:

$xml = new SimpleXMLElement( $xmlString );
$ids_to_delete = array( 1, 4 );
foreach ($ids_to_delete as $id) {
    $result = $xml->xpath( "//element[@id='$id']" );
    foreach ( $result as $node ) {
        $dom = dom_import_simplexml($node);
        $dom->parentNode->removeChild($dom);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多