本文介绍在 php 中使用 simplexml 解析 xml 时,如何正确提取所有同名子节点(如多个 `
在处理商品类 XML 数据(如 SHOPML 或自定义 Feed)时,常遇到同一标签重复出现的情况,例如一个商品对应多张替代图片,均以
要完整捕获全部
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 // ✅ 此处为字符串数组,非单个字符串
];
}⚠️ 关键注意事项:
-
标签名严格匹配:原始 XML 使用
和
,代码中误写为 IMG_URL 将导致空值;
- 类型强制转换:(string)$node 比 __toString() 更安全,可避免对象未初始化时的警告;
- 空白处理:XML 内容常含换行与缩进,建议用 trim() 清理 URL 字符串;
- 健壮性增强:生产环境应添加节点存在性检查(如 isset($item->IMG_ALTERNATIVE))及异常捕获。
最终,$data['xxx']['img_alt'] 将是一个包含全部替代图 URL 的索引数组(如 ['https://...', 'https://...']),可直接用于循环生成 或批量下载等后续逻辑。










