2011-02-18 14 views
3

私はXMLファイルからPHPサイトマップパーサを実装しています。私は比較的うまくやっています。しかし、パーサーはより動的になる必要があります。見つかったすべてのchild_nodeに対して繰り返しループを繰り返す再帰関数を実装する必要があります。ノードは、別のchild_node内に多くのchild_nodeを含むことができます。私が今まで行ったことは、child_nodeごとに異なる変数名を持つforeachループを個別に実装することでしたが、これはあまり柔軟ではないので受け入れられません。PHPでXMLナビゲーションサイトマップを解析する

これは私のxmlファイルです:

<sitemap> 
    <node> 
     <id>rootnode</id> 
     <link>home.html</link> 
    </node> 
    <node> 
     <id>about</id> 
     <link>about.html</link> 
    </node> 
    <node> 
     <id>contact</id> 
     <link>contact.html</link> 
     <child_node> 
      <id>contact_uk</id> 
      <link>contact_uk.html</link> 
      <child_node> 
       <id>customer_support_uk</id> 
       <link>customer_support_uk.html</link> 
      </child_node> 
     </child_node> 
     <child_node> 
      <id>contact_usa</id> 
      <link>contact_usa.html</link> 
     </child_node> 
    </node> 

    <node> 
     <id>products</id> 
     <link>products.html</link> 
    </node> 
</sitemap> 

あなたはノードコンタクトがchild_node内child_nodeを持っていることに注意してくださいすることができます。これは再帰関数に必要なところです。

これは私の現在のPHPコードです:

$source = 'sitemap.xml'; 


    // load as file 
    $sitemap = simplexml_load_file($source, null, true); 


    foreach ($sitemap->node as $node) { 

     if ($node->child_node != "") { 
      echo "$node->link<br/>"; 
      foreach ($node->child_node as $child) { 
       if ($child->child_node != "") { 
        echo "&nbsp;&nbsp;" . $child->link . "<br/>"; 
        foreach ($child->child_node as $innerchild) { 
         echo "&nbsp;&nbsp;&nbsp;&nbsp;" . $innerchild->link . "<br/>"; 
        } 
       } else { 
        echo "&nbsp;&nbsp;" . $child->link . "<br/>"; 
       } 
      } 
     } else { 
      echo "$node->link<br/>"; 
     } 
    } 

このPHPは正しい出力を持っているが、私はその親child_node内のすべてのchild_nodeのための別の別々のforeachループを作成する必要があります。誰かが、サイトマップにあるchild_node内のすべてのchild_nodeをトラバースするためにPHPコードを変更する方法について正しい方向で私を指摘できますか?

多くの感謝!

+0

はどのように深く、それらのネストされたchild_nodesは行くことができますか?無限であれば、再帰関数を使いたいと思うでしょう。それ以外の場合は、2つのレベルしかない場合は、ネストされたループが最も簡単です。 –

+0

非常に深く進むことができます。上の例では、その子は別の子の中に1つしかありません。しかし、実際には、それは非常に深くなる(10以上)。再帰関数はあまりよくありません。私はこれが私が必要としていることを知っています。手伝ってくれますか?ありがとう – seedg

答えて

4

テスト...でも動作するはずはない:

function print_node($node, $level){ 
echo str_repeat("-",$level); 
echo "$node->link\n"; 
if ($node->child_node != "") { 
     foreach ($node->child_node as $child) { 
      print_node($child,$level+1); 
     } 
    } 

} 
$source = 'sitemap.xml'; 


$sitemap = simplexml_load_file($source, null, true); 
foreach ($sitemap->node as $node) 
    print_node($node,0); 
+0

優れています。完璧に働いた – seedg

1

再帰関数が必要な場合は、各最上位ノードを処理するときにそれを呼び出します。

インデント機能の使い方を読者に面白い練習として残しておきます。 ;-)

+0

ops ...私は運動を解決しました:D –