PHP解析带命名空间ARES XML获取are:ICO节点报错解决
错误原因
- 直接写
$result->are:ICO触发语法错误,是因为PHP对象属性名不能直接包含未转义的冒号,解析器读到冒号就会判定语法非法 - SimpleXML默认不会自动挂载带命名空间的节点,哪怕语法写对,也不能直接通过
前缀:节点名的格式读取命名空间下的XML元素 - 原代码的节点遍历路径也存在错误,
<are:ICO>节点是<are:Zaznam>的子节点,直接在<are:Odpoved>下读取会拿不到值
正确实现方案
有两种稳定的实现方式,都不依赖XML里写死的前缀,只要命名空间URI不变就能正常运行:
方法1:通过children()方法读取命名空间节点
这是最通用的写法,适合需要逐层遍历节点的场景:
<?php $xml = new SimpleXMLElement("https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_std.cgi?ico=24766208", LIBXML_NOCDATA, true); // 填写are前缀对应的命名空间URI,直接从XML根节点的xmlns:are属性复制即可 $areNamespace = 'http://wwwinfo.mfcr.cz/ares/xml_doc/schemas/ares/ares_answer/v_1.0.1'; // 获取are命名空间下的Odpoved节点集合 foreach ($xml->children($areNamespace)->Odpoved as $result) { // 读取Zaznam节点下的ICO值,强转字符串避免返回SimpleXMLElement对象 $ico = (string)$result->children($areNamespace)->Zaznam->ICO; } echo $ico; // 输出24766208
要点说明:
- 读取哪个命名空间下的节点,就把对应命名空间的URI传入
children()方法,比如要读dtt、udt前缀的节点,替换成对应命名空间URI即可 - 所有读取到的节点值建议手动强转成字符串、整型等标量类型,避免后续传参、输出时出现类型错误
方法2:通过XPath直接定位目标节点
适合不需要逐层遍历,直接拿深层节点值的场景,代码更简洁:
<?php $xml = new SimpleXMLElement("https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_std.cgi?ico=24766208", LIBXML_NOCDATA, true); // 给XPath注册命名空间前缀 $xml->registerXPathNamespace('are', 'http://wwwinfo.mfcr.cz/ares/xml_doc/schemas/ares/ares_answer/v_1.0.1'); // 直接查询所有are:ICO节点 $icoRes = $xml->xpath('//are:ICO'); $ico = (string)$icoRes[0]; echo $ico; // 输出24766208
内容的提问来源于stack exchange,提问作者Slepice1234
相关产品推荐
相关产品推荐

