簡體   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