如何使用simplexml_load_file解析节点名含冒号的XML文件?
问题原因
你遇到的是XML命名空间解析问题:节点名冒号前的education、common是命名空间前缀,对应XML头部定义的唯一URI,SimpleXML默认不会将带命名空间的节点暴露在默认对象属性中,所以print_r看不到对应内容,并非节点没有加载成功。
解决方法
方法1:使用children()方法指定命名空间读取
children()方法可以指定要读取的命名空间,支持直接传命名空间URI,或者传前缀+第二个参数为true两种用法:
$xml = simplexml_load_file($file); // 方式A:用命名空间前缀获取(更简洁) $eduNode = $xml->children('education', true)->education; $commonNodes = $eduNode->children('common', true); // 方式B:用完整命名空间URI获取(更稳妥,避免前缀冲突) // $eduNode = $xml->children('http://www.orcid.org/ns/education')->education; // $commonNodes = $eduNode->children('http://www.orcid.org/ns/common'); // 读取节点内容示例 echo $commonNodes->{'created-date'}; // 输出创建时间 echo $commonNodes->organization->name; // 输出学校名称University of Virginia echo $commonNodes->organization->address->city; // 输出城市Charlottesville
方法2:使用XPath查询
先注册对应命名空间,再用XPath语法直接定位目标节点,适合结构复杂的XML:
$xml = simplexml_load_file($file); // 注册命名空间前缀和对应URI $xml->registerXPathNamespace('edu', 'http://www.orcid.org/ns/education'); $xml->registerXPathNamespace('common', 'http://www.orcid.org/ns/common'); // 查询节点,xpath返回数组,取下标0即可拿到目标节点 $createdDate = $xml->xpath('//common:created-date')[0]; $orgName = $xml->xpath('//common:organization/common:name')[0]; echo $createdDate; echo $orgName;
内容的提问来源于stack exchange,提问作者yarek
相关产品推荐
相关产品推荐

