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

7次阅读

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

本文介绍在 php 中使用 simplexml 解析含重复标签(如多个 ``)的 xml 数据,将其值统一提取为数组,避免 `->__toString()` 仅返回首个节点的局限性。

在处理电商类 XML 数据(如 SHOPXML 格式)时,常遇到同一层级下存在多个同名元素(例如多个 ),而 php 的 SimpleXMLElement 默认将重复标签视为对象集合——直接调用 $item->IMG_ALTERNATIVE->__toString() 仅返回第一个匹配项,无法获取全部值。

正确做法是:将同名节点视为可遍历的数组(即使只有一个,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 使用 如何从 XML 中提取多个同名节点并构建成数组如何从 XML 中提取多个同名节点并构建成数组,代码中必须严格匹配(如 $item->IMGURL,而非 $item->IMG_URL);
  • 强制类型转换 (string) 更安全:比 ->__toString() 更健壮,可避免空节点触发警告;
  • foreach ($item->TAGNAME as $node) 是读取重复节点的唯一可靠方式:$item->TAGNAME 本身是 SimpleXMLElement 对象,但支持 foreach 遍历其所有同名子节点;
  • 若需兼容无 如何从 XML 中提取多个同名节点并构建成数组 的条目,foreach 循环天然跳过(空数组),无需额外判空。

最终,$data[$hash][‘img_alt’] 将是一个标准 PHP 数组(如 [‘https://…’, ‘https://…’]),可直接用于后续逻辑:批量下载、生成 html srcset、校验图片有效性等。

text=ZqhQzanResources