You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP(Laravel)解析XML遇阻:无法访问含@符号的属性

如何访问SimpleXMLElement对象中的属性?

我之前也踩过SimpleXMLElement的这个坑!你遇到的问题其实是被调试输出里的@attributes给迷惑了——这个标识只是SimpleXMLElement内部用来展示属性的方式,并不是真正可以直接访问的属性或键名。咱们来一步步解决:

你的代码与问题回顾

你原本的解析代码是这样的:

$response = file_get_contents($xml_path);
$xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
$xml2 = simplexml_load_string($xml->CompressedVehicles, 'SimpleXMLElement', LIBXML_NOCDATA);
foreach($xml2->RS->R->VS->V as $car) {
    dd($car);
}

调试输出显示$car包含@attributes数组,但你尝试$car->{'@attributes'}、$car['@attributes']['_0']等写法都返回null。

正确的解决方案

1. 直接用数组语法访问属性(推荐)

SimpleXMLElement把XML元素的属性直接映射成了数组键,所以你完全不需要管@attributes,直接用$car['属性名']就能拿到对应的值:

foreach($xml2->RS->R->VS->V as $car) {
    // 获取VIN码
    $vin = $car['_0'];
    // 获取年份
    $year = $car['_1'];
    dd($vin); // 输出:"1C6HJTAG8LL116179"
}

2. 转换成数组(备选方案)

如果需要一次性获取所有属性,可以先把SimpleXMLElement对象转换成普通数组,再通过@attributes键取出属性集合:

foreach($xml2->RS->R->VS->V as $car) {
    $carArray = (array)$car;
    $attributes = $carArray['@attributes'];
    $vin = $attributes['_0'];
    dd($vin);
}

不过这种方法多了一步转换,不如第一种直接高效,更适合需要批量处理所有属性的场景。

总结

核心要点就是:别被调试输出里的@attributes误导,SimpleXMLElement的XML属性是通过数组语法直接访问的,不需要额外的@attributes层级。

内容的提问来源于stack exchange,提问作者John Hubler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:48:15