从 SimpleXMLObject 中删除项目 [重复]

Posted

技术标签:

【中文标题】从 SimpleXMLObject 中删除项目 [重复]【英文标题】:Removing items from a SimpleXMLObject [duplicate] 【发布时间】:2013-09-17 01:43:12 【问题描述】:

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

【问题讨论】:

另见:***.com/questions/1153697/php-delete-xml-element @Kethryweryn 不完全。这指的是基于属性的过滤,而不是基于字符串 x 中的内容过滤掉整行。至少这是我从中得到的。 你说得对,读得太快了。但是,DOM 似乎是您解决问题的一个很好的起点! @Kethryweryn 不用担心。我希望我处理的 XML 提要有属性,这会让事情变得更容易。 糟糕,没有仔细阅读 - 您想删除 之外的所有内容 2. 更改非常明显:/main/item[field!=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>

【讨论】:

如果您仍然要使用 XPath,则可以通过在 XPath 表达式中构建过滤器来避免使用 if 语句:/main/item[field!=2]。 [撤回评论的其余部分:xpath 必要的,因为您需要一个简单的节点数组来删除; foreach ( $xml-&gt;item as $seg ) 中使用的迭代器不喜欢在循环中删除其项目] 好点。添加代码 cmets.【参考方案2】:

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

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

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

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

【讨论】:

以上是关于从 SimpleXMLObject 中删除项目 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

快速将 simpleXMLObject 转换为 STDClass?

如何从列表中删除项目并返回新列表而不在颤动中删除项目

从 Dev C++ 项目中删除文件

从数组中删除特定项目,未按预期工作

如何从 ListView 中删除项目而不从数据库中删除它?

如何从反应项目中删除故事书