如何使用SimpleXML清空节点指定子元素并消除残留空白字符
问题原因
你的代码没有生效,核心是SimpleXML对纯空白文本节点的处理存在限制:text()匹配到的纯空白节点在调用unset($node[0])时无法被正确识别删除,所以会残留换行和缩进。同时直接匹配所有text()也不符合你只删除path关联空白的向前兼容要求,可能误删其他节点前后的正常文本。
解决方案
推荐通过SimpleXML和DOM扩展互操作的方式处理,DOM对节点的控制更精准,完全符合你的需求:
// 将SimpleXML节点转为DOM节点,两者为引用关系,操作会同步生效 $domIncludePath = dom_import_simplexml($includePathNode); // 先收集所有path节点(避免遍历删除时指针错乱) $paths = $domIncludePath->getElementsByTagName('path'); $toRemove = []; foreach ($paths as $path) { $toRemove[] = $path; } foreach ($toRemove as $path) { // 删除path节点前的空白文本节点 $prev = $path->previousSibling; if ($prev && $prev->nodeType == XML_TEXT_NODE && trim($prev->nodeValue) === '') { $domIncludePath->removeChild($prev); } // 删除path节点后的空白文本节点 $next = $path->nextSibling; if ($next && $next->nodeType == XML_TEXT_NODE && trim($next->nodeValue) === '') { $domIncludePath->removeChild($next); } // 删除path节点本身 $domIncludePath->removeChild($path); }
运行上述代码后,你的示例输入就会得到预期的输出,只会删除path节点及对应的关联空白,其他所有非path的元素、非空白文本都会完整保留,满足向前兼容要求。
内容的提问来源于stack exchange,提问作者Dinu
相关产品推荐
相关产品推荐

