




本文介绍在 php 中使用 simplexml 解析 xml 时,如何正确提取所有同名子节点(如多个 ``)并构建成数组,避免仅获取首个节点的常见错误。
在处理商品类 XML 数据(如 SHOPML 或自定义 Feed)时,常遇到同一标签重复出现的情况,例如一个商品对应多张替代图片,均以 标签声明。若直接调用 $item->IMG_ALTERNATIVE->__toString(),SimpleXML 仅返回第一个匹配节点的值,后续节点会被静默忽略——这正是原代码中 img_alt 始终只存单个 URL 的根本原因。
要完整捕获全部 节点,需将同名元素视为可遍历的节点集合。SimpleXML 将重复标签自动映射为 SimpleXMLElement 对象数组(即使只有一个节点),因此应使用 foreach 显式遍历:
foreach ($xml->SHOP->SHOPITEM as $item) {
// 提取所有 IMG_ALTERNATIVE 节点并转为字符串数组
$imgAlternatives = [];
foreach ($item->IMG_ALTERNATIVE as $altNode) {
$imgAlternatives[] = trim((string)$altNode);
}
$data[md5($item->URL->__toString())] = [
'item_id' => (string)$item->ITEM_ID,
'title' => (string)$item->PRODUCT,
'text' => (string
)$item->DESCRIPTION,
'item_url' => trim((string)$item->URL),
'img_url' => trim((string)$item->IMGURL), // 注意:原始 XML 中是 @@##@@,非 @@##@@
'img_alt' => $imgAlternatives // ✅ 此处为字符串数组,非单个字符串
];
}⚠️ 关键注意事项:
最终,$data['xxx']['img_alt'] 将是一个包含全部替代图 URL 的索引数组(如 ['https://...', 'https://...']),可直接用于循环生成 或批量下载等后续逻辑。