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: