2011-02-18 6 views
3

XML 파일에서 PHP 사이트 맵 파서를 구현 중입니다. 나는 비교적 잘하고있다. 그러나 파서가 더 다이내믹해야합니다. 발견 된 모든 child_node에 대해 루핑을 계속하는 재귀 함수를 구현해야합니다. 노드는 다른 child_node 내에 많은 child_node를 포함 할 수 있습니다. 지금까지 내가 한 것은 모든 child_node에 대해 서로 다른 변수 이름을 가진 별도의 foreach 루프를 구현하는 것이었지만 너무 유연하지 않으므로 허용되지 않습니다.PHP로 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을 가지고 있습니다 할 수 있습니다

이 내 XML 파일입니다. 이것은 재귀 함수가 필요한 곳입니다.

이 내 현재 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 루프를 만들어야합니다. 누군가가 sitemap에있는 child_node 내의 모든 child_node를 탐색하기 위해 PHP 코드를 변경하는 방법에 대해 올바른 방향으로 나를 가리킬 수 있습니까?

감사합니다.

+0

얼마나 깊은 그 중첩 된 child_nodes 갈 수? 무제한이라면 재귀 함수를 사용하고 싶을 것입니다. 그렇지 않으면, 단지 2 레벨이라면 중첩 된 루프가 가장 쉽습니다. –

+0

아주 깊게 갈 수 있습니다. 위의 예에서, 한 아이는 다른 아이 안에 있습니다. 그러나 실제로는 매우 깊어 질 것입니다 (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

작전 ... 나는 운동을 해결했습니다 : D –