9 votes

PHP DOM - compter les noeuds enfants ?

Extrait HTML n° 1

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

Extrait HTML n° 2

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

Code PHP

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

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

Sortie avec $x = extrait 1
1
3

Sortie avec $x = extrait n°2
0
1

voir la démo de travail : http://codepad.viper-7.com/11BGge

Mes questions
1. Comment est-ce possible ?
2. Comment compter correctement les nœuds enfants avec DOM ?

EDIT :
comme l'a dit Silkfire, l'espace vide est considéré comme un nœud de texte. J'ai mis

$doc->preserveWhiteSpace = false;

mais les résultats sont toujours les mêmes : http://codepad.viper-7.com/bnG5io

Des idées ?

6voto

onetrickpony Points 9833

Il suffit de compter les nœuds non textuels dans votre boucle :

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

print $count;

Utilisation de xpath :

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

Pour supprimer les nœuds de texte vides, lorsque preserveWhiteSpace=false ne fonctionne pas (comme je l'ai suggéré dans le chat) :

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

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

3voto

silkfire Points 5745

L'espace blanc est considéré comme un nœud car il s'agit d'une texte() nœud ( DOMText ).

Vous pouvez faire en sorte que cela fonctionne en modifiant votre foreach boucle :

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

0voto

Yogus Points 2243

Firefox, Chrome et la plupart des autres navigateurs traitent les espaces blancs vides ou les nouvelles lignes comme des nœuds de texte, mais pas Internet Explorer. Ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X