2012-07-15 11 views
6

Estoy análisis de HTML que tiene este aspecto:relativa php XPath

<table class="linesTbl"> 
     <tr class="linesHeader"> 
      <td><h3>EventName</h3></td> 
     </tr><tr class="linesColumns"> 
      <td>Date</td><td class="contestLine">Description</td> 
     </tr><tr class="linesAlt1"> 
      <td>Time</td><td>X1</td><td>Price1</td> 
     </tr><tr class="linesAlt1"> 
      <td>&nbsp;</td><td>X2</td><td>Price2</td></tr> 
</table> 

Hay varias tablas como este, así que estoy tratando de bucle a través de ellos y agarrar todos los datos. No estoy seguro de cómo xpath maneja las consultas en php. Actualmente estoy tratando de extraer el EventName de cada tabla.

$doc = new DOMDocument(); 
@$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 

foreach ($xpath->query("//table[@class = 'linesTbl']") as $tableNode){ 

    $headerTag = $xpath->query(".//h3", $tableNode); 
    echo $headerTag->nodeValue; 

} 

Para la consulta de $ headerTag, también intenté query("./tr/td/h3", $tableNode). ¿Cómo hago esta consulta relativa?

Respuesta

9

Su expresión XPath es relativo ya:

$headerTag = $xpath->query(".//h3", $tableNode); 
          ^  ^^^^^^^^^^ 
          | relative-to node 
         relative path 

Sin embargo, este devuelve una lista de nodos, ni un solo nodo, así que si lo hace:

echo $headerTag->item(0)->nodeValue; 
       ^^^^^^^^^ 

Se puede acceder al elemento que desea, vea la salida:

EventName 

Espero que esto sea útil.

+0

gracias. que lo resolvió – sayhey69

+0

probablemente un * bit * tarde: ¿cuál es la consulta ** correcta **, entonces? El código que escribió sugiere que la consulta original no es la correcta. – superjos

+0

Sí, un poco tarde, pero lo más probable es que la consulta original no fuera el problema, sino la lectura de los datos de resultado del objeto de resultado. 'query()' devuelve un [** DOMNodeList **] (http://php.net/DOMNodeList), el OP más o menos esperaba que devolviera un solo ** DOMElement **. – hakre

0

En realidad, su html no es adecuado.

En cuanto XPATH, puede hacerlo de esta manera para dirigirse especialmente a h3 etiqueta: -

/table[@class='linesTbl']/tr[@class='linesHeader']/td/h3 
+0

Si solo necesitara el EventName, esto funcionaría, pero necesito analizar todos los datos y mantener todo asociado a la tabla de la que proviene. – sayhey69