[PHP DOM] pak alle span elementen binnen een specifiek element
Door
Jan Niemand
op 06-11-2010 14:57
gewijzigd op 06-11-2010 14:58
881 views
Mijn script laadt een webpagina in waarna ik de gewenste tabel kan pakken met:
$doc->getElementById("tabel_id");
Nu wil ik graag alle spans die in deze tabel staan doorlopen zodat ik de data die erin staat een voor een kan uitlezen, voor de hele pagina zou ik dat als volgt doen:
foreach($doc->getElementsByTagName('span') as $data) {
echo $data->nodeValue;
}
Maar zoals gezegd wil ik alleen de spans die in de eerder genoemde tabel staan pakken, ik ben niet zo handig met DOM manipulatie en heb er eigenlijk alleen via jQuery ervaring mee waardoor ik het in PHP niet voor elkaar krijg.
Als de span tag ook meerdere lagen onder het element zit, moet je xpath gebruiken
Dat is niet waar. Dit werkt prima:
<?php
$doc = new DOMDocument();
$doc->loadHTML('
<html>
<body>
<table id="tabel_id">
<tbody>
<tr>
<td><span id="hit_1">awe</span>some</td>
<td><span id="hit_2">taar<span id="hit_3">t</span></span></td>
</tr>
</tbody>
</table>
</body>
</html>');
foreach ($doc->getElementsByTagName('span') as $span)
$ids[] = $span->getAttribute('id');
assert('array_diff($ids, array("hit_1", "hit_2", "hit_3")) == array()');
?>
Maar getElementById werkt bij mij niet. De handleiding zegt dat dat komt omdat PHP niet weet welk attribuut het id bevat. Daar XPath voor gebruiken werkt wel (want id is immers net als ieder ander attribuut ook gewoon een attribuut)
<?php
function getElementById($id, $doc)
{
$xpath = new DOMXPath($doc);
return $xpath->query("//*[@id='$id']", $doc)->item(0);
}
getElementById('tabel_id', $doc)->getEle..;
?>
Maar als je dan toch met XPath bezig gaat, dan heb je die twee stappen niet nodig, dan kan het ook gemakkelijk in één stap:
<?php
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//table[@id="tabel_id"]//span') as $span)
{
...
}
?>