一尘不染

在PHP的SimpleXML中,删除具有特定属性的子级

php

我有几个使用SimpleXML访问的具有不同属性的相同元素:

<data>
    <seg id="A1"/>
    <seg id="A5"/>
    <seg id="A12"/>
    <seg id="A29"/>
    <seg id="A30"/>
</data>

我需要删除ID为“ A12” 的特定 seg 元素,该怎么做?我尝试遍历 seg 元素并未 设置
特定的元素,但这不起作用,元素仍然存在。

foreach($doc->seg as $seg)
{
    if($seg['id'] == 'A12')
    {
        unset($seg);
    }
}

阅读 314

收藏
2020-05-26

共1个答案

一尘不染

尽管SimpleXML提供了一种删除XML节点的方法,但其修改功能还是受到一定限制。另一种解决方案是使用DOM扩展。dom_import_simplexml()将帮助您将转换SimpleXMLElementDOMElement

只是一些示例代码(经过PHP 5.2.5测试):

$data='<data>
    <seg id="A1"/>
    <seg id="A5"/>
    <seg id="A12"/>
    <seg id="A29"/>
    <seg id="A30"/>
</data>';
$doc=new SimpleXMLElement($data);
foreach($doc->seg as $seg)
{
    if($seg['id'] == 'A12') {
        $dom=dom_import_simplexml($seg);
        $dom->parentNode->removeChild($dom);
    }
}
echo $doc->asXml();

输出

<?xml version="1.0"?>
<data><seg id="A1"/><seg id="A5"/><seg id="A29"/><seg id="A30"/></data>

顺便说一句:使用XPath(SimpleXMLElement->xpath)时,选择特定节点要简单得多:

$segs=$doc->xpath('//seq[@id="A12"]');
if (count($segs)>=1) {
    $seg=$segs[0];
}
// same deletion procedure as above
2020-05-26