关于SimpleXML跳过属性的技术问询及测试XML内容解析
解决SimpleXML中属性获取(跳过属性)的问题
我来帮你搞定这个SimpleXML的属性访问问题——这绝对是新手用SimpleXML最容易踩的小坑之一,刚接触的时候很容易把属性和子元素的访问方式搞混。
先明确核心点:在SimpleXML中,元素的属性是通过数组式语法$element['属性名']来访问的,而不是像子元素那样用->符号。下面结合你的XML示例,一步步给你演示如何正确获取那些你之前"跳过"的属性:
第一步:加载XML内容
先把你的XML加载到SimpleXML对象中(无论是从字符串还是文件加载,方法类似):
$xmlContent = '<?xml version="1.0" encoding="UTF-8"?> <Transfer> <ABR recordLastUpdatedDate="20180329" replaced="N"> <ABN status="ACT" ABNStatusFromDate="20000214">80007321682</ABN> <EntityType> <EntityTypeInd>PUB</EntityTypeInd> <EntityTypeText>Australian Public Company</EntityTypeText> </EntityType> <MainEntity> <NonIndividualName type="MN"> <NonIndividualNameText>BLACK CABS COMBINED PTY LTD</NonIndividualNameText> </NonIndividualName> </MainEntity> </ABR> </Transfer>'; $xml = simplexml_load_string($xmlContent);
第二步:获取元素的属性
比如要拿到recordLastUpdatedDate和replaced这两个属性:
// 获取ABR的recordLastUpdatedDate属性 $lastUpdated = (string)$xml->ABR['recordLastUpdatedDate']; // 获取ABR的replaced属性 $replacedFlag = (string)$xml->ABR['replaced']; echo "记录最后更新日期:$lastUpdated\n"; // 输出20180329 echo "是否被替换:$replacedFlag\n"; // 输出N
第三步:获取元素的属性和文本内容
return (<ABN>既有属性(`status`、`ABNStatusFromDate`)又有文本内容,处理方式如下: ```php // 获取ABN的status属性 $abnStatus = (string)$xml->ABR->ABN['status']; // 获取ABN的ABNStatusFromDate属性 $statusFromDate = (string)$xml->ABR->ABN['ABNStatusFromDate']; // 获取ABN标签内的文本内容(即ABN号码) $abnNumber = (string)$xml->ABR->ABN; echo "ABN状态:$abnStatus\n"; // 输出ACT echo "ABN状态生效日期:$statusFromDate\n"; // 输出20000214 echo "ABN号码:$abnNumber\n"; // 输出80007321682 ``` ### 几个关键注意事项 - 为什么要加`(string)`?因为SimpleXML返回的属性/元素都是`SimpleXMLElement`对象,直接echo时PHP会自动转成字符串,但如果要把值存入变量做后续处理(比如存入数据库、字符串拼接),显式转换可以避免意外的对象操作问题。 - 如果有多个同名元素(比如多个<ABR>),可以用`foreach`循环遍历属性: ```php foreach ($xml->ABR as $abrItem) { echo "当前ABR更新日期:" . (string)$abrItem['recordLastUpdatedDate'] . "\n"; } ``` - 别把属性和子元素搞混!很多人一开始会错误地用`$xml->ABR->recordLastUpdatedDate`,这是在找<ABR>下的子元素`<recordLastUpdatedDate>`,而不是属性,自然会"跳过"找不到。 内容的提问来源于stack exchange,提问作者R C)
相关产品推荐
相关产品推荐

