从SimpleXML对象中删除项目

时间:2013-09-12 15:18:41

标签: php xml simplexml

简而言之,我想知道如何做到这一点,因为没有(据我所知)似乎是用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作为enteries的对象。对于看似简单的请求,是否有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

这似乎可以解决问题:

$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>

答案 1 :(得分:0)

如果我没记错,你就无法删除节点。

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

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

其他方式是使用SimpleXML :: asXML()来获取XML代码并使用preg_replace对其进行修改,但它又不是很漂亮......可能使用完整的XML DOM?