通八洲科技

PHP 中解析 XML 字符串并提取指定节点与属性的完整教程

日期:2025-12-29 00:00 / 作者:心靈之曲

本文介绍如何使用 php 的 simplexml 扩展直接解析 xml 字符串,精准提取 `` 元素的 `number` 属性及子节点 `worked`、`active_hours`、`inactive_hours` 的值,并构建结构化数组,无需冗余转换。

在 PHP 中处理 XML 数据时,最简洁高效的方式是直接使用内置的 simplexml_load_string() 函数——它将 XML 字符串解析为一个可遍历的对象,支持直观的属性访问(如 $node['attr'])和子元素访问(如 $node->child),完全无需先转成数组或 JSON。

以下是一个完整、健壮的解析示例,适用于您提供的结构:根节点 包含多个 子节点,其中部分 拥有嵌套的 、 和 子元素,而其他则为空。


    
    
    
        1
        7
        7
    
    
        1
        12
        13
    
    
    

XML;

// 解析 XML 字符串为 SimpleXMLElement 对象
$xml = simplexml_load_string($xml_string);
if ($xml === false) {
    throw new RuntimeException('Invalid XML string: ' . libxml_get_errors());
}

$result = [];

// 遍历所有  元素
foreach ($xml->day as $day) {
    // 提取 day 的 number 属性(强制转为整型)
    $dayNumber = (int) $day['number'];

    // 安全提取子节点值:使用空合并操作符(?:)提供默认值 0
    $result[$dayNumber] = [
        'worked'        => (int) ($day->worked ?? 0),
        'active_hours'  => (int) ($day->active_hours ?? 0),
        'inactive_hours'=> (int) ($day->inactive_hours ?? 0)
    ];
}

// 输出结果(调试用)
print_r($result);

关键要点说明:

? 进阶提示:
若需同时获取 weekday_number、name 等其他属性,可扩展数组结构:

$result[$dayNumber] = [
    'weekday_number' => (int) $day['weekday_number'],
    'name'           => (string) $day['name'],
    'worked'         => (int) ($day->worked ?? 0),
    // ...其余字段
];

? 注意事项:

通过上述方式,您即可高效、准确地从任意结构化的 XML 字符串中提取所需字段,并轻松集成到循环、数据库写入或 API 响应等业务逻辑中。