PHP如何基于ITEM_ID合并两个XML feed并补充stock_quantity库存值
修正方案
以下是可正常运行的修改后代码,核心修改点如下:
- 修正产品ID取值逻辑,改用
$item->ITEM_ID获取items.xml中的产品唯一标识 - 修复CDATA字段解析逻辑,保留描述字段的原有CDATA结构
- 新增库存缺省值,匹配不到库存的产品默认库存设为0
- 所有SimpleXML节点取值统一强转为字符串,避免对象引用异常
<?php // 下载主产品feed $catalog_name = 'items.xml'; $catalog_url = 'https://admin.srovnej-ceny.cz/export/ca1b20bb6415b2d93ff36c9e3df3f96c.xml'; file_put_contents($catalog_name, fopen($catalog_url, 'r')); // 下载库存feed $stock_name = 'stock.xml'; $stock_url = 'https://www.korkmaz.cz/heureka/export/availability.xml'; file_put_contents($stock_name, fopen($stock_url, 'r')); // 解析库存数据生成映射表 $stocks = simplexml_load_file("stock.xml") or die("Error: 无法加载库存文件"); $_stocks = []; foreach($stocks->children() as $item) { $_stocks[strval($item['id'])] = strval($item->stock_quantity); } // 解析主产品feed $xml = simplexml_load_file("items.xml") or die("Error: 无法加载主产品文件"); // 初始化DOM对象生成新feed $dom = new DOMDocument(); $dom->encoding = 'utf-8'; $dom->xmlVersion = '1.0'; $dom->formatOutput = true; $xml_file_name = 'products.xml'; $root = $dom->createElement('SHOP'); $i = 0; foreach($xml->children() as $item) { $item_node = $dom->createElement('SHOPITEM'); // 写入基础字段 $item_node->appendChild($dom->createElement('ITEM_ID', strval($item->ITEM_ID))); $item_node->appendChild($dom->createElement('PRODUCTNAME', htmlspecialchars(strval($item->PRODUCTNAME)))); // 处理带CDATA的描述字段 $desc_node = $dom->createElement('DESCRIPTION'); $desc_node->appendChild($dom->createCDATASection(strval($item->DESCRIPTION))); $item_node->appendChild($desc_node); $item_node->appendChild($dom->createElement('MANUFACTURER', strval($item->MANUFACTURER))); $item_node->appendChild($dom->createElement('EAN', strval($item->EAN))); $item_node->appendChild($dom->createElement('IMGURL', strval($item->IMGURL))); $item_node->appendChild($dom->createElement('PRICE_VAT', strval($item->PRICE_VAT))); // 写入匹配到的库存,无匹配默认设为0 $stock_val = isset($_stocks[strval($item->ITEM_ID)]) ? $_stocks[strval($item->ITEM_ID)] : 0; $item_node->appendChild($dom->createElement('STOCK', $stock_val)); $root->appendChild($item_node); $i++; } $dom->appendChild($root); $dom->save($xml_file_name); echo "已成功生成{$xml_file_name},共包含{$i}条商品数据"; ?>
内容的提问来源于stack exchange,提问作者Martin Orešanský
相关产品推荐
相关产品推荐

