gpt4 book ai didi

php - SimpleXML - 删除 xpath 节点

转载 作者:行者123 更新时间:2023-12-03 00:39:55 25 4
gpt4 key购买 nike

我对如何删除可以通过 xpath 搜索找到的某些内容的父节点感到有点困惑:

$xml = simplexml_load_file($filename);
$data = $xml->xpath('//items/info[item_id="' . $item_id . '"]');
$parent = $data[0]->xpath("parent::*");
unset($parent);

所以,它找到了项目 id,没有问题 - 但取消设置并没有消除这个 <items>节点。我想做的就是删除 <items>...</items>对于该产品。显然,有大量的 <items> xml 文件中的节点,因此它无法执行 unset($xml->data->items)因为那样会删除所有内容。

非常感谢任何想法:-)

最佳答案

<?php
$xml = new SimpleXMLElement('<a><b/></a>');
unset($xml->b);
echo $xml->asxml();

这按预期工作(从文档中删除 元素),因为调用了 __unset() method (或模块代码中的等效项)。
但是,当您调用 unset($parent); 时,它只会删除存储在 $parent 中的对象引用,但不会影响对象本身或存储在 $xml 中的文档。为此我会转向 DOMDocument

<?php
$doc = new DOMDOcument;
$doc->loadxml('<foo>
<items>
<info>
<item_id>123</item_id>
</info>
</items>
<items>
<info>
<item_id>456</item_id>
</info>
</items>
<items>
<info>
<item_id>789</item_id>
</info>
</items>
</foo>');
$item_id = 456;

$xpath = new DOMXpath($doc);
foreach($xpath->query('//items[info/item_id="' . $item_id . '"]') as $node) {
$node->parentNode->removeChild($node);
}
echo $doc->savexml();

打印

<?xml version="1.0"?>
<foo>
<items>
<info>
<item_id>123</item_id>
</info>
</items>

<items>
<info>
<item_id>789</item_id>
</info>
</items>
</foo>

关于php - SimpleXML - 删除 xpath 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2442314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com