如何一次性保存完整XML节点并将大XML文件拆分为多个小文件
PHP 实现XML大文件按节点拆分方案
问题原因
原代码执行无内容的核心原因:SimpleXMLElement 对象直接作为字符串输出时,仅会返回节点内的纯文本内容,不会输出完整的标签结构,你需要调用相关方法获取完整的节点XML代码。
实现代码(按每100个style节点拆分一个文件)
if (file_exists('items.xml')) { $xml = simplexml_load_file('items.xml'); $allStyles = $xml->style; $total = count($allStyles); $perFile = 100; // 计算总拆分文件数 $fileCount = ceil($total / $perFile); for ($i = 0; $i < $fileCount; $i++) { // 初始化DOM对象生成新XML,避免编码兼容问题 $dom = new DOMDocument('1.0', 'UTF-8'); $root = $dom->createElement('style_list'); $dom->appendChild($root); $start = $i * $perFile; $end = min(($i + 1) * $perFile, $total); for ($j = $start; $j < $end; $j++) { // 完整导入原style节点到新XML,保留所有子字段和属性 $importNode = $dom->importNode(dom_import_simplexml($allStyles[$j]), true); $root->appendChild($importNode); } // 按序号命名输出文件,比如items_1.xml、items_2.xml $dom->save("items_" . ($i + 1) . ".xml"); } }
代码说明
- 不需要逐个手动编写节点的子字段,直接通过节点导入能力完整保留所有结构
- 每个输出的文件都是合法的XML格式,自带标准XML声明和根节点
<style_list> - 自动计算总拆分文件数,最后不足100条的剩余节点会单独存入最后一个文件
内容的提问来源于stack exchange,提问作者I-Suck-At-This
相关产品推荐
相关产品推荐

