Is there a neater / better way of traversing my DomElement Object?
In particular, when I am looking to get values 4, 5 and 6, I am thinking that there must be a better way of getting nodes than ->nextSibling->nextSibling->nextSibling->nextSibling
etc...? Is there a method available which would enable me to specify the sibling which I require?
public function fire()
{
$url = "http://test.com";
$html = $this->downloadPage($url);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$myXpath = $xpath->query('//*[@id="test_table"]');
if (!is_null($myXpath))
{
$domElement = $myXpath->item(0);
$parent = $domElement->firstChild->nextSibling->nextSibling->firstChild->nextSibling;
$value1 = $parent->nodeValue;
$value2 = $parent->nextSibling->nodeValue;
$value3 = $parent->nextSibling->nextSibling->nodeValue;
$this->info("Value 1: " . $value1);
$this->info("Value 2: " . $value2);
$this->info("Value 3: " . $value3);
}
else {
$this->info("Error");
}
}
The table has the following structure
<table id="test_table">
<tr>
<td width="40"></td> // Dont Want
<td width="55"></td> // Dont Want
<td width="55"></td> // Dont Want
<td width="55"></td> // Dont Want
</tr>
<!--A comment--> // Dont Want
<tr>
<td>AM</td>
<td class="pricing">aaa</td> // Value1
<td class="pricing">bbb</td> // Value2
<td class="pricing">ccc</td> // Value3
</tr>
<tr>
<td>PM</td>
<td class="pricing">ddd</td> // Value4
<td class="pricing">eee</td> // Value5
<td class="pricing">fff</td> // Value6
</tr>
<!--Updated 10:31 18/10/2013--> // I want this date comment
<tr>
<td> </td> // Dont Want
<td colspan="3" align="right"></td> // Dont Want
</tr>
</table>
I'm not totally clear on what exactly you are needing, but it sounds like you want to get the values from the cells with the class of pricing
and also get the Updated
comment.
// Get the table, to use as a context node for the other queries
$table = $xpath->query('//table[@id="test_table"]')->item(0);
// Get cells with class="pricing"
$pricings = $xpath->query('descendant::td[@class="pricing"]', $table);
foreach ($pricings as $pricing) {
// E.g. $text = $pricing->nodeValue;
var_dump($doc->saveXML($pricing));
}
// Get the "Updated ..." comment
$updated_query = 'string(descendant::comment()[starts-with(., "Updated ")])';
$updated = $xpath->evaluate($updated_query, $table);
var_dump($updated);