2016-05-28 16 views
3

Ich habe folgendeWie alle untergeordneten Knoten von DOMDocument abgerufen werden?

$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); 

jetzt ich alle li IDs innerhalb eines Arrays haben will.
Ich habe versucht, die folgenden:

$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); 

Wie Sie sehen können, diese [1,2]

heraus gedruckt werden Wie kann ich alle Kinder bekommen (die subchildren auch [1,2,3,4])?

Antwort

0

Mein Test unter Verwendung $dom->getElementById('mainmenu') nicht Element zurück. Aber wenn Ihre Verwendung tut, verwenden Sie nicht 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

Danke! Sauber und einfach. Genau das, worauf ich gehofft hatte! –

+0

Froh das würde helfen. Viel Glück! – splash58

0

Eine Möglichkeit, dies zu tun wäre eine weitere foreach-Schleife hinzufügen, das heißt:

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

Dies funktioniert nur mit 1 Ebene unter der Haupt-UL; Wenn Sie eine weitere Verschachtelungsebene hinzufügen, benötigen Sie die 3. Schleife und so weiter. Rekursion wird besser passen –

+0

Richtig, aber OP lieferte keinen Hinweis auf zusätzliche Verschachtelung erforderlich. – Lee