PHP使用SimpleXMLIterator解析XML并删除所有displayTextFlow节点
PHP 基于 SimpleXMLIterator 批量删除指定XML节点方案
原代码问题说明
直接对迭代器执行unset操作无法生效,迭代器仅提供遍历能力,要删除节点需要从对应节点的父元素层级执行删除操作,同时边遍历边修改XML结构会导致迭代偏移,出现漏删的情况。
修正后可直接运行代码
$filePath = file_get_contents('sample.xml'); $xml = new SimpleXMLIterator($filePath); $iterator = new RecursiveIteratorIterator($xml, RecursiveIteratorIterator::SELF_FIRST); // 先收集所有要删除的displayTextFlow节点,避免遍历过程中修改结构导致漏删 $nodesToDelete = []; foreach ($iterator as $nodeName => $element) { if ($nodeName === 'displayTextFlow') { $nodesToDelete[] = $element; } } // 批量删除收集到的节点 foreach ($nodesToDelete as $node) { // SimpleXML 固定语法,从父节点删除当前子节点 unset($node[0]); } $finalXML = $xml->asXML(); print_r($finalXML); exit;
功能验证
该代码会遍历XML的所有层级节点,无论displayTextFlow节点出现在XML的任何位置都可以被正确识别删除,完全基于SimpleXMLIterator实现,无需引入其他XML操作扩展。
内容的提问来源于stack exchange,提问作者Guru
相关产品推荐
相关产品推荐

