如何从 XML 中提取多个同名节点并构建数组

11次阅读

本文介绍在 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 // ✅ 此处为字符串数组,非单个字符串     ]; }

⚠️ 关键注意事项:

  • 标签名严格匹配:原始 XML 使用 如何从 XML 中提取多个同名节点并构建数组如何从 XML 中提取多个同名节点并构建数组,代码中误写为 IMG_URL 将导致空值;
  • 类型强制转换:(string)$node 比 __toString() 更安全,可避免对象未初始化时的警告;
  • 空白处理:XML 内容常含换行与缩进,建议用 trim() 清理 URL 字符串;
  • 健壮性增强:生产环境应添加节点存在性检查(如 isset($item->IMG_ALTERNATIVE))及异常捕获。

最终,$data[‘xxx’][‘img_alt’] 将是一个包含全部替代图 URL 的索引数组(如 [‘https://…’, ‘https://…’]),可直接用于循环生成 如何从 XML 中提取多个同名节点并构建数组 或批量下载等后续逻辑。

如何从 XML 中提取多个同名节点并构建数组

text=ZqhQzanResources