2012-07-15 4 views
6

相対のXPath PHP私はこのようになりますHTMLを解析してい

そこので、私はそれらをループしようとしている。このような複数のテーブルがあり、データのすべてをつかむ
<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> 

。私はxpathがPHPでどのようにクエリを処理するのかよくわかりません。現在、私は各テーブルからEventNameを抽出しようとしています。

$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; 

} 

$ headerTagクエリでは、私もquery("./tr/td/h3", $tableNode)を試しました。この相対的なクエリを実行するにはどうすればよいですか?

答えて

9

あなたのXPath式がすでに相対的なものである:

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

あなたが行うので、もししかし、これは、ノードリストではなく、単一のノードを返します。

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

あなたが望む要素にアクセスすることができ、出力を参照してください:

EventName 

私はこれが役に立ちそうです。

+0

感謝を。それはそれを解決した – sayhey69

+0

おそらく*ビット*遅い:**正しい**クエリは何ですか?あなたが書いたコードは、元のクエリが正しいものではないことを示しています。 – superjos

+0

ええ、もう少し遅いですが、元のクエリは問題ではない可能性が高いですが、結果オブジェクトから結果データを読み込みます。 'query()'は[** DOMNodeList **](http://php.net/DOMNodeList)を返します。OPは多かれ少なかれ1つの** DOMElement **を返すことを期待しています。 – hakre

0

実際、あなたのHTMLは適切ではありません。

XPATHについて、あなたはh3タグに特別に標的化するためにこの方法で行うことができます -

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

私はEventNameが必要な場合、これは動作しますが、私はすべてのデータを解析し、それが元になったテーブルに関連するすべてを保持する必要があります。 – sayhey69

関連する問題