[英]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.