
本文介绍在 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、校验图片有效性等。










