/ / PHP DOM - Kindknoten zählen? - php, dom

PHP DOM - Kinderknoten zählen? - php, dom

HTML-Ausschnitt # 1

<div>
</div>
<div>
<h1>headline</h1>
</div>

HTML-Ausschnitt # 2

<div></div>
<div><h1>headline</h1></div>

PHP-Code

$doc = new DOMDocument();
$doc->loadHTML($x);
$xpath = new DOMXpath($doc);
$divs = $xpath->query("//div");

foreach ($divs as $div) echo $div->childNodes->length,"<br />";

Ausgabe mit $x = Ausschnitt # 1
1
3

Ausgabe mit $x = Ausschnitt # 2
0
1

siehe Arbeitsdemo: http://codepad.viper-7.com/11BGge

Meine Fragen
1. Wie kann das sein?
2. Wie man Kindknoten richtig mit zählt DOM?

BEARBEITEN:
Wie Silkfire sagte, wird leerer Raum als Textknoten betrachtet. ich setze

$doc->preserveWhiteSpace = false;

Aber die Ergebnisse sind immer noch die gleichen: http://codepad.viper-7.com/bnG5io

Irgendwelche Ideen?

Antworten:

6 für die Antwort № 1

Zählen Sie einfach Nicht-Text-Knoten in Ihrer Schleife:

$count = 0;
foreach($div->childNodes as $node)
if(!($node instanceof DomText))
$count++;

print $count;

Xpath verwenden:

$nodesFromDiv1 = $xpath->query("//div[1]/*")->length;
$nodesFromDiv2 = $xpath->query("//div[2]/*")->length;

Wenn leere Textknoten entfernt werden sollen, preserveWhiteSpace=false funktioniert nicht (wie ich im Chat vorgeschlagen habe):

$textNodes = $xpath->query("//text()");

foreach($textNodes as $node)
if(trim($node->wholeText) === "")
$node->parentNode->removeChild($node);

3 für die Antwort № 2

Whitespace wird als Knoten betrachtet, da es sich um Text() Knoten (DOMText).

Sie können dies tun, indem Sie Ihr ändern foreach Schleife:

foreach ($divs as $div) {
echo $div->childNodes->length - $xpath->query("./text()", $div)->length, "<br>";
}

0 für die Antwort № 3

Firefox, Chrome und die meisten anderen Browser behandeln leere Leerzeichen oder neue Zeilen als Textknoten, Internet Explorer jedoch nicht Hier