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

PHP对象数据访问:如何获取CONSIGNEE对应的Name属性

解决PHP访问XML对象中特定类型Party的Name问题

嘿,我完全懂你碰到的这个麻烦——当XML里有多个<Party>节点转成PHP对象后,它们会变成一个对象数组,你得筛选出Type为CONSIGNEE的那个才能拿到对应的Name。下面给你几种实用的解决办法:

方法一:遍历筛选(最直观)

先拿到所有Party的集合,然后循环遍历找到类型匹配的那个:

// 获取所有Party对象的集合(多个Party时会是数组)
$parties = $result->TraceShipmentResult->Result->Shipment->Parties->Party;

// 遍历每个Party,找到CONSIGNEE
foreach ($parties as $party) {
    // 一定要把Type转成字符串再比较,因为SimpleXML节点是对象类型
    if ((string)$party->Type === 'CONSIGNEE') {
        echo $party->Name; // 这里会输出H T HACKNEY CO
        break; // 找到目标就退出循环,提高效率
    }
}

方法二:用array_filter快速筛选

如果习惯用数组操作,可以把Party集合转成数组后用array_filter过滤:

// 把Party集合转为数组
$partiesArray = (array)$result->TraceShipmentResult->Result->Shipment->Parties->Party;

// 筛选出Type为CONSIGNEE的Party
$consigneeParty = array_filter($partiesArray, function($party) {
    return (string)$party->Type === 'CONSIGNEE';
});

// 取出第一个匹配的结果(array_filter返回的数组键不一定连续,用reset获取第一个元素)
$consignee = reset($consigneeParty);
if ($consignee) {
    echo $consignee->Name;
}

注意:处理XML命名空间

你的XML里<Parties>和<Party>都带有xmlns="http://tempuri.org/"命名空间,如果直接访问拿不到数据的话,需要用children()方法指定命名空间:

$namespace = 'http://tempuri.org/';

// 通过命名空间获取Parties下的Party节点
$parties = $result->TraceShipmentResult->Result->Shipment
    ->children($namespace)->Parties
    ->children($namespace)->Party;

// 之后的遍历逻辑和方法一一样
foreach ($parties as $party) {
    if ((string)$party->Type === 'CONSIGNEE') {
        echo $party->Name;
        break;
    }
}

额外小提示

如果XML里只有一个<Party>节点,那么$parties会是单个对象而不是数组,这时候可以先判断类型再转成数组,避免遍历出错:

$parties = $result->TraceShipmentResult->Result->Shipment->Parties->Party;
// 如果不是数组,就转成包含单个元素的数组
if (!is_array($parties)) {
    $parties = [$parties];
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:35