2009-02-26 6 views
0

Ich habe gerade gelesen über das DOM-Modul in PHP und jetzt versuche ich es zum Parsen eines HTML-Dokuments zu verwenden. Die Seite sagte, dass dies eine viel bessere Lösung als Preg ist, aber ich habe es schwer herauszufinden, wie man es benutzt.Brauchen Sie Hilfe mit PHP-DOM XPath Parsing-Tabelle

Die Seite enthält eine Tabelle mit Daten und X Anzahl der Ereignisse für das Datum.

Zuerst muss ich den Text (ein Datum) von einem tr mit valign = "bottom" bekommen und dann muss ich alle Spaltenwerte von allen tr mit valign = "top", die unter diesem tr ist. Ich brauche alle Spaltenwerte von jedem tr unter dem tr mit dem Datum bis zum nächsten tr mit valign = "bottom" (nächstes Datum). Die Anzahl von tr mit Spaltendaten ist unbekannt, kann Null oder eine Menge von ihnen sein.

Dies ist, was die HTML auf der Seite wie folgt aussieht:

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

Ich habe die ersten beiden Tage, so weit kommen konnte (ich bin in den ersten beiden nur interessiert) aber ich weiß nicht, wie ich von hier aus gehen soll.

die XPath-Abfrage Ich verwende das Datum trs zu bekommen, ist

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

Jetzt brauche ich einen Weg, um all Ereignisse zu dem Zeitpunkt, dh für diesen Tag zu verbinden. Wählen Sie alle tds und alle Spaltenwerte bis zum nächsten Datum tr aus.

Antwort

0

Verwenden Sie following-sibling().

+0

Danke, aber wie sagen Sie XPath, nur Geschwister bis zu einem Knoten mit [Valign = "unten"] auszuwählen? Wenn ich following-sibling :: tr [@ valign = "top"] an meinem ausgewählten Datum verwende, gibt es alle folgenden trs zurück, wenn ich nur die bis zum nächsten Datum tr möchte? –

+0

Wählen Sie alle Knoten aus, die Geschwister des aktuellen tr [@ valign = "bottom"] folgen, aber nicht den Geschwistern des nächsten folgen. Zum Beispiel für die erste: folgende Geschwister :: tr [@ valign = "bottom"] [1] und nicht (folgende Geschwister :: 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

Dieser XPath-Ausdruck

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

oder

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

Ergebnis in einem Knoten mit Datum Zellen eingestellt.

Wie bekomme ich Zellen zwischen Markierungen?

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