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
相关产品推荐
相关产品推荐

