PHP: bir XML dosyasının tüm düzeyleri döngü SimpleXML kullanma

3 Cevap php

Ben bir XML dosyasında düğüm ilk seviye dönmek ve bir sırasız liste halinde yazmak için SimpleXML kullanan bir işlevi var:

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()

XML Ben düğümleri iç içe olduğunu, kullanıyorum:

<?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>

Şimdi, ben şu anda dönen düğümlerin alt düğümleri eklemek için başlıyorum. Ben orada kaç düzeyleri biliyorum, ve benim listesine bu katmayan bile bir xml dosyası çocuk düğümler TÜM seviyeleri döngü için bir yolu var mı?

3 Cevap

Yani temelde ne yapmak gerekir sonra kontroller geçerli düğüm kendi <asset/> çocuklar vardır ve tutar derin recursing eğer geçerli düğümün her <asset/> çocuk, HTML oluşturur alan bir fonksiyondur Ağacın aşağı.

İşte bunu nasıl bulunuyor:

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;
}

Bu arada, ben çok geri aslında daha print veya yankı şey için "PrintX" adında bir işlev beklenebilir. Belki de bu işlevleri "buildX" isim vermeliyiz?

tekrarlamalı bir fonksiyon kullanmanız gerekir. Burada XML bir dizi çıkaran bir örnektir. Bu PHP dokümanlar dan - http://www.php.net/manual/en/ref.simplexml.php. Sen çıkış listesi bu düzeltebilirler.

<?php 
function XMLToArray($xml) 
{ 
  if ($xml instanceof SimpleXMLElement) { 
    $children = $xml->children(); 
    $return = null; 
  } 

  foreach ($children as $element => $value) { 
    if ($value instanceof SimpleXMLElement) { 
      $values = (array)$value->children(); 

      if (count($values) > 0) { 
        $return[$element] = XMLToArray($value); 
      } else { 
        if (!isset($return[$element])) { 
          $return[$element] = (string)$value; 
        } else { 
          if (!is_array($return[$element])) { 
            $return[$element] = array($return[$element], (string)$value); 
          } else { 
            $return[$element][] = (string)$value; 
          } 
        } 
      } 
    } 
  } 

  if (is_array($return)) { 
    return $return; 
  } else { 
    return $false; 
  } 
} 
?>
<?php
function all_nodes($xml){
    $all=array();
    function add($node){
        array_push($all,$node);
        foreach($node as $child){
            add($child);
        }
    }
    add($xml->documentElement);
    return $all;
}
?>

Bu belgedeki tüm düğümleri içeren bir dizi döndürür.