PHP使用SimpleXMLElement提取XML的identifierValue节点无结果怎么办
问题根因
解析失败的核心原因是目标XML声明了默认命名空间,SimpleXML 不会将带命名空间的节点直接注册为普通对象属性,不带命名空间匹配规则的XPath查询、直接对象链式调用都无法命中这类节点。
你本地测试的简单XML没有声明默认命名空间,所有节点都属于全局无命名空间节点,所以相同写法可以正常运行;而你拿到的这份业务XML根节点带有默认命名空间声明,所有子节点默认归属该命名空间,原有写法自然匹配不到结果。
对应解决方案
修正XPath写法
先注册命名空间前缀,再编写带前缀的查询路径即可:
$NewXML = new SimpleXMLElement($response); // 注册命名空间,前缀可自定义,命名空间URI必须和XML根节点xmlns属性值完全一致 $NewXML->registerXPathNamespace('abr', 'http://abr.business.gov.au/ABRXMLSearch/'); // 查询路径中所有节点都带上注册的前缀 $ABN = $NewXML->xpath('//abr:ABRPayloadSearchResults/abr:response/abr:searchResultsList/abr:searchResultsRecord/abr:ABN/abr:identifierValue');
修正对象链式调用写法
通过children()方法传入对应命名空间,获取命名空间下的节点集合后再做链式调用:
$NewXML = new SimpleXMLElement($response); // 读取XML中声明的所有命名空间 $ns = $NewXML->getNamespaces(true); // 取默认命名空间(空字符串键对应默认命名空间)下的节点做链式调用 $ABN = $NewXML->children($ns['']) ->response ->searchResultsList ->searchResultsRecord ->ABN ->identifierValue;
排查提示:如果按上述写法还是拿不到值,可以先打印
$NewXML->getNamespaces(true)查看XML实际声明的命名空间URI,确保传入的URI和文件内声明完全一致即可。
内容的提问来源于stack exchange,提问作者Duke_Si1ver
相关产品推荐
相关产品推荐

