使用 SimpleXML、PHP 删除 XML 节点

Delete XML node with SimpleXML, PHP

我正在尝试使用 PHP(简单XML)删除 XML 节点。

这是我的 XML:

<?xml version="1.0"?>
<items>
    <a>
        <name>A1</name>
        <b>
            <title>Item1</title>
            <url>item1</url>
        </b>
        <b>
            <title>Item2</title>
            <url>item2</url>
        </b>
        <b>
            <title>Item3</title>
            <url>item3</url>
        </b>
    </a>
    <a>
        <name>A2</name>
        <b>
            <title>Item1</title>
            <url>item1</url>
        </b>
    </a>
</items>    

这是我的 PHP 代码:

<?php
    $xml = simplexml_load_file($_GET["xml"]);
    $sxe = new SimpleXMLElement($xml->asXML());


    $ID = $_GET["ID"];
    $i = -1;
    $num = $_GET["num"];

    foreach ($sxe->children() as $var) {
        if ($var == $ID) {
            foreach ($var->children() as $data) {
                if ($data == "link") {
                    $i++;

                    if ($i == $num) {
                        if ( ! empty($sxe)) {
                            unset($sxe[0]);
                        }
                    }
                }
            }
        }
    }

    $sxe->asXML($_GET["xml"]);  
?>

此代码查找 $ID 的数据(例如,$ID="A1")。它看起来要删除的节点是一个节点(带有 和 ),它是#$num 节点。

示例:如果 $ID="A1" 且 $num=1, 它需要删除标题为 "Item2" 和 url "item2".

的节点

我做错了什么?

谢谢!

使用xpath 查找节点。在你的例子中它将是

//a[name="A1"]/b[2]

并使用DomDocument方法removeChild改变xml

$sxe = simplexml_load_string($xml);
$node = $sxe->xpath('//a[name="'. $ID .'"]/b['. $num .']');
$dom=dom_import_simplexml($node[0]);
$dom->parentNode->removeChild($dom);
echo $sxe->asXML();