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