我有几个表嵌套在一个表中,我使用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查询的经验?
我非常希望能够使用更精确的查询,并且希望能够保持查询相对而不是使其成为绝对查询。
答案 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