php xpath表解析问题

时间:2011-01-05 18:42:25

标签: php xpath

我有几个表嵌套在一个表中,我使用php xpath解析。

我正在使用一系列xpath,因为我将代码分解为多个方法调用的概念单元,并且这种结构在没有嵌套表的其他场景中运行良好。

以下是代码:

// create a host DOM document
$dom = new DOMDocument();

// load the html string into the dom
$dom->loadHTML($html_string);

// make an xpath object out of the dom
$xpath = new DOMXpath($dom);

// run query to extract the rows from the master table
$context_nodes = $xpath->query('//table[@id="id1"]/tr[position()>1]');

// parse data from the individual tables nested in each master table row
foreach($context_nodes as $context_node){
    $interesting_nodes[] = $xpath->query('table[2]/tr[td[2]]', $context_node);
}

生成的$ interesting_nodes数组包含空的DOMNodeLists。

$ context_nodes DOMNodeList包含有效数据。每个$ context_node的html内容如下所示:

<td>
    <table></table>
    <table>
        <tr>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
        </tr>
    </table>
</td>

我尝试了以下简化的$ intesting_nodes查询来匹配任何表:

$intesting_nodes[] = $xpath->query('table', $context_node);

但是仍然会产生相同的空DOMNodeLists。

现在是有趣的部分

当我尝试这样的$ interesting_nodes查询时:

$interesting_nodes[] = $xpath->query('*[2]/*[*[2]]', $context_node);

然后一切正常 ;但如果我用相应的“table”,“tr”或“td”标签替换任何“*”,则查询会再次中断。

有没有其他人在php中遇到过这种行为和相对xpath查询的经验?

我非常希望能够使用更精确的查询,并且希望能够保持查询相对而不是使其成为绝对查询。

2 个答案:

答案 0 :(得分:0)

我明白了。 :)

如果主表标记不存在,php xpath实现不知道如何处理表内部节点(即:tr,td)。

我的外部td标记导致xpath查询出现意外结果。

将$ context_nodes查询修改为:

$context_nodes = $xpath->query('//table[@id="id1"]/tr[position()>1]/td');

我们很好。

答案 1 :(得分:0)

我想也许您需要在后续查询中使用相对路径(以。开头),请参阅http://php.net/manual/en/domxpath.query.php#99760