如何循环遍历 XML 文件,其中包含 PHP 的重复节点

How do I loop through a XML file with repeating nodes with PHP

我想使用 PHP 从 API 响应循环遍历 XML 文件,创建一个包含 XML 文件夹节点的数组 idname,对数组内容进行降序排序(按 id),echo/return name 内容。

XML内容:

<?xml version="1.0"?>
<success>
    <document>
        <folder>
            <id>295</id>
            <name>My Folder</name>
            <parent>
                <folder>
                    <id>83</id>
                    <name>Contents</name>
                    <parent>
                        <folder>
                            <id>45</id>
                            <name>Sub Folder</name>
                            <parent>
                                <folder>
                                    <id>21</id>
                                    <name>Root Folder</name>
                                </folder>
                            </parent>
                        </folder>
                    </parent>
                </folder>
            </parent>
        </folder>
    </document>
</success>

我自己用 SimpleXML 尝试了一些东西,但一直卡住,因为 XML 输出有这些嵌套的 <parent> 节点,我不确定如何处理这些,以只需获取 idname 节点。

这是我目前的 PHP 部分:

<?php

if (file_exists('api_results.xml')) {
    $xml = simplexml_load_string('api_results.xml');
    
    foreach($xml->document->folder as $folder)
    {
        $folders = array();
        
        foreach($folder as $key => $value)
        {
            $folder[(string)$key] = (string)$value;
        }
        
        $folders[] = $folder;
    }

print_r($folders);
      
} else {
    exit('Failed to open api_results.xml.');
}

如何创建一个数组并添加每个 id/name 节点然后对数组内容进行排序?

您可以使用 XPath,它允许您搜索 <folder> 节点的列表。使用 //folder 将在文档的所有级别进行搜索,让您不必担心嵌套的 foreach 循环。

然后您可以使用 $folder->id 获取每个 <folder> 中的 <id> 元素。

一件事是您应该使用 simplexml_load_file() 从文件加载数据,字符串版本旨在从字符串加载。

$xml = simplexml_load_file('api_results.xml');

$folders = [];
foreach ($xml->xpath('//folder') as $folder) {
    $folders[] = [(string)$folder->id, (string)$folder->name];
}

print_r($folders);

您的测试文档给出了...

Array
(
    [0] => Array
        (
            [0] => 295
            [1] => My Folder
        )

    [1] => Array
        (
            [0] => 83
            [1] => Contents
        )

    [2] => Array
        (
            [0] => 45
            [1] => Sub Folder
        )

    [3] => Array
        (
            [0] => 21
            [1] => Root Folder
        )

)