You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ý

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:36:03