2009-02-26 22 views
0

私は最近、PHPでDOMモジュールについて読みましたが、今はHTMLドキュメントの解析に使用しようとしています。このページはpregを使用するよりもはるかに良い解決策だと言いましたが、私はそれをどのように使用するかを考え出すのに苦労しています。PHP DOM XPath解析テーブルのヘルプが必要

このページには、日付とそのイベントのX件数を含む表が含まれています。

最初に、valign = "bottom"でtrからテキスト(日付)を取得する必要があります。そして、そのtr以下のvalign = "top"を持つすべてのtrからすべての列値を取得する必要があります。 valの下の各trのすべての列の値が、valign = "bottom"(次の日付)の次のtrまでの日付とともにtrの下にある必要があります。カラムデータを持つtrの数は不明であり、ゼロまたはそれらの多くである可能性があります。

これは、ページ上のHTMLは次のようになります。これまでのところ、私は最初の二つの日付(私は最初の二つの唯一の興味)を取得することができました

<table> 
    <tr valign="bottom"> 
     <td colspan="4">2009-02-26</td> 
    </tr> 
    <tr valign="top"> 
     <td>21:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="top"> 
     <td>23:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="bottom"> 
     <td colspan="4">2009-02-27</td> 
    </tr> 
    <tr valign="top"> 
     <td>06:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="top"> 
     <td>10:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="top"> 
     <td>13:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
</table> 

私はここから行く方法を知らない。私は日付のTRSを取得するために使用

XPathクエリが

$result = $xpath->query('//tr[@valign="bottom"][position()<3]); 

ある今私はすなわち、現在までに、その日のすべてのイベントを接続する方法が必要です。すべてのtdsとすべての列の値を次の日付trまで選択します。

答えて

0

following-sibling()を使用してください。

+0

ありがとうございます。しかし、[valign = "bottom"]のノードまで兄弟を選択するにはどうすればよいですか?私が選択した日付にfollow-sibling :: tr [@ valign = "top"]を使用すると、次の日付trまでのものだけを必要とするときに、次のtrをすべて返します。 –

+0

現在のtr [@ valign = "bottom"]の兄弟をフォローしているノードをすべて選択しますが、次のノードの兄弟はフォローしません。たとえば、最初の1つの場合: follow-sibling :: tr [@ valign = "bottom"] [1]ではなく(following-sibling :: tr [@ valign = "bottom"] [2]) – vartec

3
$oldSetting = libxml_use_internal_errors(true); 
libxml_clear_errors(); 

$html = new DOMDocument(); 
$html->loadHtmlFile('http://url/table.html'); 

$xpath = new DOMXPath($html); 
$elements = $xpath->query("//table/tr"); 

foreach ($elements as $item) { 
    $newDom = new DOMDocument; 
    $newDom->appendChild($newDom->importNode($item,true)); 

    $xpath = new DOMXPath($newDom); 

    foreach ($item->attributes as $attribute) { 

    for ($node = $item->firstChild; $node !== NULL; 
     $node = $node->nextSibling) { 
     if (($attribute->nodeName =='valign') && ($attribute->nodeValue=='top')) 
     { 
     print($node->nodeValue); 
     } 
     else 
     { 
     print("<br>".$node->nodeValue); 
     } 
    } 
    print("<br>"); 
    } 
} 

libxml_clear_errors(); 
libxml_use_internal_errors($oldSetting); 
0

このXPath式

/table/tr/td[@colspan=4] 

又は

/table/tr[valign='bottom']/td 

日付セルで設定ノードをもたらします。

マーク間のセルを取得するにはどうすればよいですか?

/table/tr/td[not(@colspan=4)][preceding::td[@colspan=4][1]='2009-02-26']