Php 从SimpleXMLObject中删除项
简言之,我想知道如何做到这一点,因为(据我所知)似乎没有一种方法可以通过PHP的SimpleXMLObject设置做到这一点 以下是我的xml: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
<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)
中使用的迭代器不喜欢在循环中间删除它的项]这一点很好。添加代码注释。