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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:45:31