2016-05-28 20 views
3

私は、次のDOMDocumentからすべての子ノードを取得するには?

$string = '<html><head></head><body><ul id="mainmenu"> 
    <li id="1">Hallo</li> 
    <li id="2">Welt 
    <ul> 
     <li id="3">Sub Hallo</li> 
     <li id="4">Sub Welt</li> 
    </ul> 
    </li> 
</ul></body></html>'; 
$dom = new DOMDocument; 
$dom->loadHTML($string); 

は今、私は1つのアレイ内のすべてのliのIDを持っていると思いますしています。
私は次のことを試してみました:

$all_li_ids = array(); 
$menu_nodes = $dom->getElementById('mainmenu')->childNodes; 
foreach($menu_nodes as $li_node){ 
    if($li_node->nodeName=='li'){ 
     $all_li_ids[]=$li_node->getAttribute('id');   
    } 
} 
print_r($all_li_ids); 

ご覧のかもしれませんが、これはどのように私はすべての子供たち(subchildren同様[1,2,3,4])を得るのですか[1,2]

を出力しますか?それを行うには

答えて

0

私のテストは$dom->getElementById('mainmenu')を使って要素を返しません。しかし、あなたが使用している場合は、Xpathを使用しないでください。

$xpath = new DOMXPath($dom); 
$ul = $xpath->query("//*[@id='mainmenu']")->item(0); 

$all_li_ids = array(); 
// Find all inner li tags 
$menu_nodes = $ul->getElementsByTagName('li'); 
foreach($menu_nodes as $li_node){ 
     $all_li_ids[]=$li_node->getAttribute('id');   
} 
print_r($all_li_ids); 1,2,3,4 
+0

ありがとう!清潔でシンプル。ちょうど私が望んでいたもの! –

+0

助けてくれてうれしいです。がんばろう! – splash58

0

一つの方法は、すなわち別のforeachループを追加することです:

foreach($menu_nodes as $node){ 
    if($node->nodeName=='li'){ 
     $all_li_ids[]=$node->getAttribute('id');   
    } 
    foreach($node as $sub_node){ 
     if($sub_node->nodeName=='li'){ 
      $all_li_ids[]=$sub_node->getAttribute('id');   
     } 
    } 
} 
+0

これは、主ulに1レベル下でのみ動作します。別のレベルの入れ子を追加すると、3番目のループなどが必要になります。再帰はよりよく適合するでしょう –

+0

本当ですが、OPは余分なネスティングが必要であるというエビデンスを提供しませんでした。 – Lee

関連する問題