php DOM getAttribute
Bon, j'ai un étrange cas ici, que je ne peux pas comprendre.
Je veux analyser une liste sur un site web. Le code HTML ressemble un peu à ceci:
<!-- ... -->
<ul id="foo">
<li data-text="item 1">Blabla</li>
<li data-text="item 2">Blabla</li>
<li data-text="item 3">Blabla</li>
<li data-text="item 4">Blabla</li>
</ul>
<!-- ... -->
Maintenant je veux récupérer tous les éléments de la liste. J'utilise le DOMDocument-classe. Jusqu'à présent, qui fonctionne très bien:
$dom = new DOMDocument();
if (!$dom->loadHTML($html)) {
die ('Could not parse...');
}
$list = $dom->getElementById('foo');
$items = $list->childNodes;
foreach ($items as $item) {
print_r($item);
}
Mais maintenant, je suis à la recherche d'une méthode simple pour la lecture de la data-text
attribut. Ce que j'ai fait:
foreach ($items as $item) {
echo $item->getAttribute('data-text');
}
Cela fonctionne très bien pour le premier élément, mais ensuite il bloque le foreach de la boucle. La sortie est:
point 1
Fatal error: Call to undefined method DOMText::getAttribute()
dans example.php sur la ligne 44
Ce que je ne comprends pas, ici, est de savoir comment l'appel de la getAttribute
méthode modifie le contexte de la boucle foreach. Voici donc deux questions:
- Comment l'invocation de la méthode vis ma boucle foreach? Deuxièmement,
quelle est la plus élégante solution de contournement? - J'ai réalisé que je pouvais faire une boucle par
$item->attributes with
encore un autre
foreach méthode, puis de comparer le nom de l'attribut àdata-text
et
lire la valeur dans le cas d'une correspondance, mais il y a sûrement d'être un
meilleure façon de le faire?!
OriginalL'auteur clausvdb | 2013-01-28
Vous devez vous connecter pour publier un commentaire.
Le problème est le
ul
a des nœuds de texte, comme des enfants le long avec leli
s textnodes n'ont pas d'attribut, par conséquent, vous obtenez un message d'erreur. il suffit de tester si l'enfant est un nœud d'élément avant de vous essayez d'accéder à son attributVous pouvez également utiliser
getElementsByTagName()
, mais si vous avez des listes imbriquées lesli
s dans leur seront également sélectionnés.OriginalL'auteur Musa