2011-05-04 14 views
11

Jak uzyskać pierwszy poziom elementów domowych przez Domdocument PHP?Jak uzyskać pierwszy poziom elementów domowych przez Domdocument PHP?

przykład z kodem, który nie współpracuje z Q - tooken & A: http: //stackoverflow.com/questions/1540302/how-to-get-nodes-in-first-level-using-php-domdocument

<?php 
$str=<<< EOD 
<div id="header"> 
</div> 
<div id="content"> 
    <div id="sidebar"> 
    </div> 
    <div id="info"> 
    </div> 
</div> 
<div id="footer"> 
</div> 
EOD; 

$doc = new DOMDocument(); 
$doc->loadHTML($str); 
$xpath = new DOMXpath($doc); 
$entries = $xpath->query("/"); 
foreach ($entries as $entry) { 
    var_dump($entry->firstChild->nodeValue); 
} 
?> 

dzięki, Szwarcu

Odpowiedz

26

pierwszy poziom elementów poniżej węzła głównego mogą być dostępne z

$dom->documentElement->childNodes 

właściwość childNodes zawiera DOMNodeList, którą można powtórzyć za pomocą foreach.

Zobacz DOMDocument::documentElement

Jest to atrybut wygoda, która pozwala na bezpośredni dostęp do węzła potomnego, który jest dokument element dokumentu.

i DOMNode::childNodes

DOMNodeList który zawiera wszystkie dzieci tego węzła. Jeśli nie ma dzieci, jest to pusta lista DOMNodeList.

Od childNodes jest własnością DOMNode każda klasa rozszerzenie DOMNode (który jest większość klas w Domu) mają tę właściwość, tak aby pierwszy poziom elementów poniżej w DOMElement to aby uzyskać dostęp do własności childNode DOMElement użytkownika.


Zauważ, że jeśli używasz DOMDocument::loadHTML() na nieprawidłowym formacie HTML lub częściowych dokumentów, moduł HTML parser doda szkielet HTML z HTML i ciała tagi, więc w drzewie DOM, HTML w swoim przykładzie będzie

<!DOCTYPE html … "> 
<html><body><div id="header"> 
</div> 
<div id="content"> 
    <div id="sidebar"> 
    </div> 
    <div id="info"> 
    </div> 
</div> 
<div id="footer"> 
</div></body></html> 

, które należy wziąć pod uwagę podczas przechodzenia lub używania XPath. W konsekwencji, przy użyciu

$dom = new DOMDocument; 
$dom->loadHTML($str); 
foreach ($dom->documentElement->childNodes as $node) { 
    echo $node->nodeName; // body 
} 

będzie iteracyjne tylko węzeł <body> DOMElement. Wiedząc, że libxml doda szkielet, będziesz musiał wykonać iterację nad elementami potomnymi elementu <body>, aby uzyskać elementy div z przykładowego kodu, np.

$dom->getElementsByTagName('body')->item(0)->childNodes 

jednak robi tak będzie również uwzględniać wszystkie spacje węzłów, więc albo trzeba się upewnić, aby ustawić preserveWhiteSpace false lub zapytania do prawego elementu nodeType jeśli tylko chcą dostać DOMElement węzły, np

foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $node) { 
    if ($node->nodeType === XML_ELEMENT_NODE) { 
     echo $node->nodeName; 
    } 
} 

lub użyć XPath

$dom->loadHTML($str); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('/html/body/*') as $node) { 
    echo $node->nodeName; 
} 

Dodatkowe informacje:

Powiązane problemy