
本文介绍在 php 中使用 simplexml 解析含重复标签(如多个 `
在处理电商类 XML 数据(如 SHOPXML 格式)时,常遇到同一层级下存在多个同名元素(例如多个
正确做法是:将同名节点视为可遍历的数组(即使只有一个,SimpleXML 也支持 foreach),通过显式循环收集所有
foreach ($xml as $item) { // 提取所有 IMG_ALTERNATIVE 节点(可能为 0、1 或多个) $imgAlternatives = []; foreach ($item->IMG_ALTERNATIVE as $alt) { $imgAlternatives[] = (string)$alt; // 强制类型转换确保字符串安全 } $data[md5($item->URL->__toString())] = [ 'item_id' => (string)$item->ITEM_ID, 'title' => (string)$item->PRODUCT, 'text' => (string)$item->DESCRIPTION, 'item_url' => (string)$item->URL, 'img_url' => (string)$item->IMGURL, // 注意原始 XML 中是 @@##@@,非 @@##@@ 'img_alt' => $imgAlternatives // ✅ 此处为字符串数组,而非单个字符串 ]; }
⚠️ 关键注意事项:
- 标签名大小写与空格敏感:示例中 XML 使用
和
,代码中必须严格匹配(如 $item->IMGURL,而非 $item->IMG_URL);
- 强制类型转换 (string) 更安全:比 ->__toString() 更健壮,可避免空节点触发警告;
- foreach ($item->TAGNAME as $node) 是读取重复节点的唯一可靠方式:$item->TAGNAME 本身是 SimpleXMLElement 对象,但支持 foreach 遍历其所有同名子节点;
- 若需兼容无
的条目,foreach 循环天然跳过(空数组),无需额外判空。
最终,$data[$hash][‘img_alt’] 将是一个标准 PHP 数组(如 [‘https://…’, ‘https://…’]),可直接用于后续逻辑:批量下载、生成 html srcset、校验图片有效性等。