DOMXpath - Obtenir de l'attribut href et de la valeur de texte d'un élément
J'ai donc une chaîne HTML comme ceci:
<td class="name">
<a href="/blah/somename23123">Some Name</a>
</td>
<td class="name">
<a href="/blah/somename28787">Some Name2</a>
</td>
À l'aide de XPath, je suis en mesure d'obtenir la valeur de l'attribut href utilisant cette requête Xpath:
$domXpath = new \DOMXPath($this->domPage);
$hrefs = $domXpath->query("//td[@class='name']/a/@href");
foreach($hrefs as $href) {...}
Et C'est encore plus facile d'obtenir une valeur de texte, comme ceci:
//Xpath auto. strips any html tags so we are
//left with clean text value of a element
$domXpath = new \DOMXPath($this->domPage);
$names = $domXpath->query("//td[@class='name']/");
foreach($names as $name) {...}
Maintenant, je suis curieux de savoir, comment puis-je combiner ces deux requêtes pour obtenir les deux valeurs avec une seule requête (Si c'est quelque chose que même possible?).
OriginalL'auteur Marko Jovanović | 2011-07-25
Vous devez vous connecter pour publier un commentaire.
Chercher
et puis arracher le texte avec
nodeValue
et l'attribut avecgetAttribute('href')
.En dehors de cela, vous pouvez combiner des requêtes Xpath avec l'Opérateur Union
|
de sorte que vous pouvez utiliser.
OriginalL'auteur Gordon
Pour réduire le code à une seule boucle, essayez:
Que ci-dessus 🙂 Trop lent ..
Merci! Gordon a été rapide 🙂
OriginalL'auteur Ryan
Façon la plus simple,
evaluate
est pour cette tâche!La façon la plus simple d'obtenir une valeur est par
evaluate()
méthode:Remarque: il est important de limiter XPath revient à 1 point de la première
a
dans ce cas), et cast la valeur avecstring()
ouround()
, etc.Donc, dans un ensemble de plusieurs éléments, à l'aide de votre
foreach
code,PS: cet exemple est uniquement pour
evaluate
'illustration... Lorsque l'information existe déjà sur le nœud, utilisez ce que vous propose meilleure performance, comme les méthodes degetAttribute()
,saveXML()
, etc. et les propriétés comme$nodeValue
,$textContent
, etc. fourni parDOMNode
.Voir @Gordon réponse à ce problème particulier.
La sous-requête XPath (le contexte) est bon pour les cas complexes ou symplify votre code, en évitant de vérifier hasChildNodes() + boucle pour $childNodes, etc. avec pas de gain significatif de performance.
OriginalL'auteur Peter Krauss