PHP Xpath跟随兄弟姐妹

时间:2010-01-23 19:55:18

标签: php xpath domxpath

我正在尝试使用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

取值

相反,它为每一个打印ALL tr class =“indent1s”。

感谢。

1 个答案:

答案 0 :(得分:1)

修改

好吧也许这可以帮到你。只需让每个兄弟都用PHP检查属性:

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

一般来说你的目标是什么?如果您只想打印出节点,那么使用SAX处理结构会更合适也更容易(使用PHP的SAX)。

或者XSLT但是我无法帮助你。