PHP根据属性删除XML节点:现有代码无法运行求助
解决指定ID删除XML中节点的问题
我来帮你排查代码里的问题,你的实现没生效主要是几个关键错误导致的,咱们一步步修正:
代码里的核心错误
- 加载文件方法错误:你用了
simplexml_load_string($file),但$file是本地文件名,不是XML字符串内容,应该用simplexml_load_file($file)来加载文件。 - 根节点遍历逻辑错误:
$xml本身就是<archive>根节点对象,不需要再遍历$xml->archive,直接遍历$xml->unit就能拿到所有目标节点。 - 属性获取方式错误:SimpleXML中获取节点属性直接用
$unit['id']即可,@id是DOM或XPath的写法,不适用于SimpleXML。 - 缺少XML保存步骤:即使修改了内存中的XML对象,也要把修改后的内容写回文件,否则不会生效。
修正后的实现方案
方案1:纯SimpleXML实现(更简洁)
$id = '0450170018'; $file = 'filename.xml'; // 正确加载XML文件 $xml = simplexml_load_file($file); // 遍历所有<unit>节点 foreach ($xml->unit as $key => $unit) { // 注意将属性转为字符串后对比,避免类型问题 if ((string)$unit['id'] === $id) { // 删除该节点 unset($xml->unit[$key]); break; // 如果只需要删除第一个匹配的节点,找到后退出循环即可 } } // 将修改后的XML写回文件 file_put_contents($file, $xml->asXML());
方案2:结合DOM实现(适合复杂操作场景)
如果你更倾向于用DOM方法删除节点,修正后的代码如下:
$id = '0450170018'; $file = 'filename.xml'; // 加载XML文件 $xml = simplexml_load_file($file); foreach ($xml->unit as $unit) { if ((string)$unit['id'] === $id) { // 将SimpleXML节点转为DOM节点 $domNode = dom_import_simplexml($unit); // 删除节点 $domNode->parentNode->removeChild($domNode); break; } } // 保存修改到文件 file_put_contents($file, $xml->asXML());
验证效果
执行代码后,你的filename.xml会变成:
<archive> <unit id="0424670018"> <data>Blah blah blah #1</data> <gdate>2018-05-28 00:42:46</gdate> </unit> </archive>
内容的提问来源于stack exchange,提问作者Vimmy
相关产品推荐
相关产品推荐

