PHP:使用simplexml循环遍历XML文件的所有级别

Nic*_*ard 4 php xml simplexml nodes

我有一个函数,它使用simplexml返回XML文件中的第一级节点,并将其写入无序列表:

function printAssetMap() {
    $xml = simplexml_load_file(X_ASSETS);
    $assets = $xml->asset;
    $html = '<ul>'."\n";
    foreach ($assets as $asset) {
        $html .= '<li id="asset'.$asset->asset_assetid.'"><ins>&nbsp;</ins><a href="#">'.$asset->asset_name.' ['.$asset->asset_assetid.']</a></li>'."\n";
    }//end foreach
    $html .= '</ul>'."\n";
    return $html;
}// printAssetMap()
Run Code Online (Sandbox Code Playgroud)

我正在使用的XML,它有嵌套节点:

<?xml version="1.0"?>
<assets>
  <asset>
    <asset_name>Home</asset_name>
    <asset_url>/home</asset_url>
    <asset_assetid>1</asset_assetid>
  </asset>
  <asset>
    <asset_name>Projects</asset_name>
    <asset_url>/projects</asset_url>
    <asset_assetid>2</asset_assetid>
    <asset>
      <asset_name>Portfolio</asset_name>
      <asset_url>/projects/portfolio</asset_url>
      <asset_assetid>3</asset_assetid>
    </asset>
    <asset>
      <asset_name>Current Jobs</asset_name>
      <asset_url>/projects/current-jobs</asset_url>
      <asset_assetid>4</asset_assetid>
    </asset>
  </asset>
</assets>
Run Code Online (Sandbox Code Playgroud)

现在,我开始添加我当前返回的节点的子节点.有没有办法循环遍历xml文件中所有级别的子节点,即使我不知道有多少级别,并将它们添加到我的列表中?

Jos*_*vis 8

所以基本上你需要做的是一个函数,它接受<asset/>当前节点的每个子节点,构建HTML,然后检查当前节点是否有<asset/>自己的子节点,并在树中更深层递归.

这是你如何做到的:

function printAssetMap()
{
    return printAssets(simplexml_load_file(X_ASSETS));
}

function printAssets(SimpleXMLElement $parent)
{
    $html = "<ul>\n";
    foreach ($parent->asset as $asset)
    {
        $html .= printAsset($asset);
    }
    $html .= "</ul>\n";

    return $html;
}

function printAsset(SimpleXMLElement $asset)
{
    $html = '<li id="asset'.$asset->asset_assetid.'"><ins>&nbsp;</ins><a href="#">'.$asset->asset_name.' ['.$asset->asset_assetid.']</a>';

    if (isset($asset->asset))
    {
        // has <asset/> children
        $html .= printAssets($asset);
    }

    $html .= "</li>\n";

    return $html;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我希望一个名为"printX"的函数实际打印或回显一些东西,而不是返回它.也许您应该将这些函数命名为"buildX"?