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.
$doc->getElementById('tabel_id')->getElementsByTagName('span')


getElementById geeft een DOMElement object terug. En die kent getElementsByTagName.
En wat heb je hier aan, er hoeft maar iets te wijzigen in het gedeelte waar je uit loopt te peuren en je mag je code weer gaan zitten aanpassen.

Dus vraag gewoon om een xml-feed waarin de informatie staat die je nodig hebt!
Als de span tag ook meerdere lagen onder het element zit, moet je xpath gebruiken:
<?php
$element = $doc->getElementById($id);

$xPath = new DOMXPath($doc);
$nodeList = $xPath->query('//span', $element);
?>
Pim - op 06/11/2010 18:46:41
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)
{
...
}
?>

Reageren