0

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

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

4

2 回答 2

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>
于 2013-09-12T15:47:08.680 回答
0

如果我没记错的话,你不能删除节点。

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

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

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

于 2013-09-12T15:36:17.213 回答