从 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->item as $seg )
中使用的迭代器不喜欢在循环中删除其项目]
好点。添加代码 cmets.【参考方案2】:
如果我没记错的话,你不能删除节点。
我通过重建 SimpleXMLElement 对象而不删除值来解决这个问题 - 对数组等进行操作。
尝试迭代节点,检查值,当你想保留这个对象时,复制到另一个 SimpleXML 对象。它不漂亮,但它可以工作。
其他方法是使用 SimpleXML::asXML() 来获取 XML 代码并使用 preg_replace 修改它,但它又不漂亮......也许使用完整的 XML DOM?
【讨论】:
以上是关于从 SimpleXMLObject 中删除项目 [重复]的主要内容,如果未能解决你的问题,请参考以下文章