php - 在 PHP 的 SimpleXML 中删除具有特定属性的子项

标签 php xml dom simplexml

我有几个具有不同属性的相同元素,我正在使用 SimpleXML 访问这些元素:

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

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

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

最佳答案

虽然 SimpleXML 提供 a way to remove XML 节点,但它的修改能力有些受限。另一种解决方案是使用 DOM 扩展。 dom_import_simplexml() 将帮助您将 SimpleXMLElement 转换为 DOMElement

只是一些示例代码(使用 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

关于php - 在 PHP 的 SimpleXML 中删除具有特定属性的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/262351/

相关文章:

java - 无法针对 xsd 验证 xml

xml - SDL Tridion : Logical structure of a page in XML format

javascript - 如何在 JavaScript 中添加单选按钮的值?

javascript - 获取作为输入文本字段的 Datatables 单元格值

PHP 页面为 HTTPS

php - apache htaccess 不添加 https ://www to any page except inside. php

java - android中的卡片翻转动画

php - PHP中包含的几个函数文件

php - 用 PHP 或 JavaScript 处理的大数组

javascript - Angular - 监听特定的 DOM 插入,然后监听滚动事件