从 SimpleXMLObject 中删除项目


Removing items from a SimpleXMLObject

简而言之,我想知道如何做到这一点,因为(据我所知)似乎没有一种方法可以使用PHP的SimpleXMLObject设置来做到这一点。

这是我的 xml:

<main>
<item><field>1</field></item>
<item><field>2</field></item>
<item><field>2</field></item>
<item><field>4</field></item>
</main>

我正在尝试使用它,以便仅在新的 xml 对象中返回与字段值 2 匹配的输入。问题是能够过滤掉不匹配的内容。我尝试使用 unset,但它似乎只返回一个带有 t 和 e 作为输入的对象。对于看似简单的请求,有没有更好的解决方案?

这似乎可以解决问题:

$xml = new SimpleXMLElement("<main><item><field>1</field></item><item><field>2</field></item><item><field>2</field></item><item><field>4</field></item></main>");
$xpath = $xml->xpath('/main/item'); // Comment from IMSoP : you could add the test here with /main/item[field!=2] instead of doing it later on.
foreach($xpath as $seg)
{
    if($seg->field != 2)
    {
        $dom=dom_import_simplexml($seg);
        $dom->parentNode->removeChild($dom);
    }
}
echo $xml->asXML();

输出:

<main>
    <item>
        <field>2</field>
    </item>
    <item>
        <field>2</field>
    </item>
</main>
如果我

没记错的话,你不能删除节点。

我通过重建没有删除值的 SimpleXMLElement 对象来解决这个问题 - 对数组的操作等。

尝试迭代节点,检查值,当您想要保留此对象时,请复制到另一个 SimpleXML 对象。它不漂亮,但它可以工作。

另一种方法是使用 SimpleXML::asXML() 获取 XML 代码并用 preg_replace 修改它,但它又不漂亮......也许使用完整的XML DOM?