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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:43:11