繁体   English   中英

使用PHP SimpleXML从XML文档中删除多个同级节点

[英]Remove multiple sibling nodes from XML document with PHP SimpleXML

我有一个相当复杂的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循环无法继续,但是在两行之前和之后都是一样的

$dom = dom_import_simplexml($child);
$dom->parentNode->removeChild($dom);

我真的很感谢任何想法...

假设您的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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM