PHP实现XML重复内容合并:合并重复product节点并累加库存
PHP合并XML重复product节点解决方案
以下是实现你需求的PHP代码,核心逻辑是按SKU_parent分组节点,对SKU2的重复节点累加库存字段,其余节点保持原样:
<?php // 加载原始XML文件,替换为你的实际文件路径 $originalXml = simplexml_load_file('source.xml'); if (!$originalXml) { die('加载XML文件失败,请检查路径或文件格式'); } // 存储分组后的产品数据,键为SKU_parent $groupedProducts = []; // 遍历所有product节点 foreach ($originalXml->product as $product) { $skuParent = (string)$product->SKU_parent; // 处理SKU_parent为SKU2的重复节点 if ($skuParent === 'SKU2') { if (isset($groupedProducts[$skuParent])) { // 累加KHO1、KHO2、KHO3的数值 $groupedProducts[$skuParent]->KHO1 += (int)$product->KHO1; $groupedProducts[$skuParent]->KHO2 += (int)$product->KHO2; $groupedProducts[$skuParent]->KHO3 += (int)$product->KHO3; } else { // 首次创建该SKU的节点副本 $groupedProducts[$skuParent] = new SimpleXMLElement('<product/>'); // 复制所有子节点 foreach ($product->children() as $child) { $groupedProducts[$skuParent]->addChild($child->getName(), (string)$child); } // 转换库存字段为整数,防止字符串拼接 $groupedProducts[$skuParent]->KHO1 = (int)$groupedProducts[$skuParent]->KHO1; $groupedProducts[$skuParent]->KHO2 = (int)$groupedProducts[$skuParent]->KHO2; $groupedProducts[$skuParent]->KHO3 = (int)$groupedProducts[$skuParent]->KHO3; } } else { // 非SKU2的节点直接保留 $groupedProducts[] = $product; } } // 创建新的XML根节点,需与原始XML根节点一致(这里假设根节点是<products>) $newXml = new SimpleXMLElement('<products/>'); // 将处理后的节点写入新XML foreach ($groupedProducts as $item) { $domNode = dom_import_simplexml($item); $importedNode = $newXml->domImportNode($domNode, true); $newXml->appendChild($importedNode); } // 格式化XML输出,增加可读性 $domDocument = dom_import_simplexml($newXml)->ownerDocument; $domDocument->formatOutput = true; // 保存处理后的XML到文件,替换为你的目标路径 file_put_contents('processed.xml', $domDocument->saveXML()); // 如需直接输出,可替换为:echo $domDocument->saveXML(); ?>
使用说明
- 替换代码中的
source.xml和processed.xml为你的实际文件路径 - 如果原始XML的根节点不是
<products>,修改new SimpleXMLElement('<products/>')为对应根节点名称 - 代码默认假设重复的
SKU2节点中,除KHO1/KHO2/KHO3外的字段完全一致;若存在不一致,可调整逻辑(比如保留第一个节点的字段值)
内容的提问来源于stack exchange,提问作者Phan Vũ
相关产品推荐
相关产品推荐

