PHP Xpath следующих братьев и сестер - PullRequest
2 голосов
/ 23 января 2010

Я пытаюсь использовать xpath для получения содержимого таблицы.

Таблица выглядит так

<div>
<table>
<tr class="tableheader">
    <td> Stuff </td>
</tr>
<tr class="indent1">
     <td> Contents </td>
</tr>
<tr class="indent1">
     <td> Contents </td>
</tr>
<tr class="tableheader">
    <td> Stuff </td>
</tr>
<tr class="indent1">
     <td> Contents </td>
</tr>
<tr class="indent1">
     <td> Contents </td>
</tr>
</table>
</div>

Я пытаюсь вывести значение всех tr [@ class = 'indent1'] между заголовками таблицы

это то, что я имею до сих пор:

$elements = $xPath->query("div/table/tbody/tr[@class='tableheader']");

for ($i = 0; $i < $elements->length; $i++){
    print "Node: ".$elements->item($i)->nodeValue."\n";
    $siblings = $xPath->query("following-sibling::tr[@class='indent1']", $elements->item($i));
    foreach ($siblings as $sibling) {
        print "\tSibling: ".$sibling->nodeValue."\n";   
    }

} 

Ожидаемый результат -

Node: Stuff
   Sibling:  Contents
   Sibling:  Contents
Node: Stuff
   Sibling:  Contents
   Sibling:  Content

S

Вместо этого он печатает ВСЕ tr class = "indent1s" для каждого.

Спасибо.

1 Ответ

1 голос
/ 24 января 2010

EDIT:

ОК, может быть, это поможет вам. Просто возьмите каждого брата и проверьте атрибуты с помощью PHP:

foreach ($siblings as $sibling) {
    if (!is_null($sibling->attributes) 
        && $sibling->attributes->getNamedItem('class')->nodeValue == 'indent1') {
           break;
    }
    print "\tSibling: ".$sibling->nodeValue."\n";  
} 

Какова ваша цель в целом? Если вы просто хотите распечатать узлы, обработка структуры с помощью SAX будет более подходящей и простой (SAX с PHP).

Или, может быть, XSLT , но я не могу вам с этим помочь.

...