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