Php 从SimpleXMLObject中删除项

Php 从SimpleXMLObject中删除项,php,xml,simplexml,Php,Xml,Simplexml,简言之,我想知道如何做到这一点,因为(据我所知)似乎没有一种方法可以通过PHP的SimpleXMLObject设置做到这一点 以下是我的xml: <main> <item><field>1</field></item> <item><field>2</field></item> <item><field>2</field></item> &l

简言之,我想知道如何做到这一点,因为(据我所知)似乎没有一种方法可以通过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>

1.
2.
2.
4.

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

如果我没记错,您不能删除节点

我通过重建SimpleXMLElement对象来解决这个问题,而不需要对数组等执行删除值操作

尝试迭代节点,检查值,并在需要保留此对象时复制到另一个SimpleXML对象。虽然不漂亮,但可以用


另一种方法是使用SimpleXML::asXML()获取XML代码,并使用preg_replace对其进行修改,但它同样不漂亮。。。也许可以使用完整的XML DOM?

这似乎可以做到:

$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();
$xml=newsimplexmlement(“1224”);
$xpath=$xml->xpath('/main/item');//来自IMSoP的评论:您可以在这里使用/main/item[field!=2]添加测试,而不是稍后再进行。
foreach($xpath作为$seg)
{
如果($seg->field!=2)
{
$dom=dom\u import\u simplexml($seg);
$dom->parentNode->removeChild($dom);
}
}
echo$xml->asXML();
产出:

<main>
    <item>
        <field>2</field>
    </item>
    <item>
        <field>2</field>
    </item>
</main>

2.
2.

另请参见:@Kethryweryn不完全。这是指基于属性的过滤,而不是基于字符串x中的内容过滤掉整行。至少这是我从中得到的。你是对的,读得太快了。然而,DOM似乎是解决问题的一个很好的起点@凯瑟里韦林:不用担心。我希望我处理的XML提要有属性,可以让事情变得更简单。哎呀,我没有仔细阅读-你想删除除2之外的所有内容。变化非常明显:。如果仍要使用XPath,可以通过在XPath表达式中构建一个筛选器来避免
If
语句:
/main/item[field!=2]
。[注释的其余部分被收回:xpath是必要的,因为您需要一个简单的节点数组来删除;在
foreach($xml->item as$seg)
中使用的迭代器不喜欢在循环中间删除它的项]这一点很好。添加代码注释。