PHP使用simplexml_load_string解析PrestaShop XML生成指定键值数组
PrestaShop API XML 解析实现方案
直接用simplexml_load_string配合LIBXML_NOCDATA参数即可快速完成解析,不需要额外做复杂的数组转换,核心逻辑如下:
单条分类数据解析
针对给出的单category节点结构,直接读取节点值组装数组即可:
// 传入XML字符串加载,LIBXML_NOCDATA会自动将CDATA内容解析为普通文本节点 $xml = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); $result = []; // 读取分类ID,强转字符串避免SimpleXMLElement对象类型问题 $catId = trim((string)$xml->category->id); // 读取分类名称,默认取第一个language节点的内容 $catName = trim((string)$xml->category->name->language); $result[$catId] = $catName;
运行后$result的结构就是需要的['2' => 'Home']格式。
分类列表批量解析
如果是分类列表接口,返回的XML会包含多个同级category节点,循环处理即可:
$xml = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); $result = []; foreach ($xml->category as $categoryNode) { $catId = trim((string)$categoryNode->id); $catName = trim((string)$categoryNode->name->language); $result[$catId] = $catName; }
多语言场景适配
如果店铺开启了多语言,name节点下会有多个不同id的language节点,需要按语言维度存储名称时可以用以下逻辑:
$xml = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); $result = []; foreach ($xml->category as $categoryNode) { $catId = trim((string)$categoryNode->id); $langNameMap = []; // 遍历所有语言节点 foreach ($categoryNode->name->language as $langNode) { $langId = (string)$langNode['id']; $langNameMap[$langId] = trim((string)$langNode); } $result[$catId] = $langNameMap; }
注意点
- 必须加
LIBXML_NOCDATA参数,否则CDATA包裹的内容需要通过额外调用children()方法读取,增加冗余代码 - 取值时统一强转
string类型,避免直接存入SimpleXMLElement对象导致后续使用报错 - 不需要额外处理xlink命名空间,读取普通节点内容和常规属性时不会受命名空间影响
内容的提问来源于stack exchange,提问作者gerstavros
相关产品推荐
相关产品推荐

