PHP SimpleXML如何打印staff节点下所有data子节点的属性
PHP SimpleXML仅读取单个XML节点属性的解决办法
问题背景
用户的values.xml结构如下:
<?xml version="1.0" encoding="utf-8"?> <dataset> <data name="region1"> <staff> <data type="clerical" name="name_1" shift="1" /> <data type="clerical" name="name_2" shift="2" /> </staff> </data> </dataset>
编写的PHP脚本试图打印<staff>节点下所有<data>子节点的属性,但仅输出单个节点的属性:
<?php $xml = simplexml_load_file('values.xml'); $node = $xml->xpath('/dataset/data[@name="region1"]'); if ($node) { echo 'Node found. Node count = '.count($node); echo '<pre>'; $sha = array(); $sha = $node[0]->staff->data->attributes(); echo '</pre>'; } else { echo 'Could not find specified node.'; } echo '<pre>'; print_r($sha); echo '</pre>'; foreach ($sha as $key => $value) { echo $key.': '.$value.'<br>'; } ?>
用户期望输出两个节点的所有属性:
type: clerical name: name_1 shift: 1 type: clerical name: name_2 shift: 2
问题原因
直接使用$node[0]->staff->data时,SimpleXML只会返回第一个匹配的<data>节点,调用attributes()自然只能获取该节点的属性,因此脚本仅输出单个节点的内容。
解决办法
需要遍历所有<staff>下的<data>节点,逐个获取每个节点的属性并输出,以下是两种可行的实现方式:
方式1:遍历子节点
通过foreach循环遍历$node[0]->staff->data集合,处理每个<data>节点:
<?php $xml = simplexml_load_file('values.xml'); $node = $xml->xpath('/dataset/data[@name="region1"]'); if ($node) { echo 'Node found. Node count = '.count($node).'<br>'; // 遍历staff下的所有data子节点 foreach ($node[0]->staff->data as $dataNode) { // 获取当前节点的所有属性 $attributes = $dataNode->attributes(); // 输出属性键值对 foreach ($attributes as $key => $value) { echo $key.': '.$value.'<br>'; } // 节点间添加空行分隔 echo '<br>'; } } else { echo 'Could not find specified node.'; } ?>
方式2:直接用XPath定位目标节点
简化步骤,直接用XPath表达式定位到所有目标<data>节点,再遍历处理:
<?php $xml = simplexml_load_file('values.xml'); // 直接定位到region1下staff中的所有data节点 $dataNodes = $xml->xpath('/dataset/data[@name="region1"]/staff/data'); if ($dataNodes) { foreach ($dataNodes as $dataNode) { $attributes = $dataNode->attributes(); foreach ($attributes as $key => $value) { echo $key.': '.$value.'<br>'; } echo '<br>'; } } else { echo 'Could not find specified nodes.'; } ?>
两种方式都能实现期望的输出效果,方式2更简洁,减少了中间节点的操作步骤。
内容的提问来源于stack exchange,提问作者Norman
相关产品推荐
相关产品推荐

