在PHP中操作DOM
虽然我在整个项目中一直在使用,但它在XPath查询在PHP中操作DOM,php,symfony,dom,xpath,Php,Symfony,Dom,Xpath,虽然我在整个项目中一直在使用,但它在XPath查询//表[*[self::tbody或self::thead或self::tfoot]/tr[count(*)=2]中有一个bug,因此,作为一种解决方法,我尝试使用内置函数: for ($i=0; $i < count($tables); $i++) { $tables[$i] = purifyTables($tables[$i]); echo($tables[$i]); $dom = new DOMDocument();
//表[*[self::tbody或self::thead或self::tfoot]/tr[count(*)=2]
中有一个bug,因此,作为一种解决方法,我尝试使用内置函数:
for ($i=0; $i < count($tables); $i++) {
$tables[$i] = purifyTables($tables[$i]);
echo($tables[$i]);
$dom = new DOMDocument();
$dom->loadHTML( $tables[$i] );
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]");
echo($nodes);
echo($dom->saveHTML($nodes));
}
for($i=0;$iloadHTML($tables[$i]);
$xpath=newdomxpath($dom);
$nodes=$xpath->query(//table[*[self::tbody或self::thead或self::tfoot]/tr[count(*)=2]];
回声($节点);
echo($dom->saveHTML($nodes));
}
。。。但结果出乎意料:
<table>
<tr>
<td>
WII 5-IN-1 SPORTS KIT H7/10 5-in-1 Glow-in-the-Dark Sports
Pack for Wii
</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
Our Price: $19.99 Sale: $5.00 You Save: 75%
</td>
</tr>
</table>
DOMNodeList Object
(
[length] => 0
)
PHP Warning: DOMDocument::saveHTML() expects parameter 1 to be DOMNode, object given in /var/www/html/myscript.php on line 195
Warning: DOMDocument::saveHTML() expects parameter 1 to be DOMNode, object given in /var/www/html/myscript.php on line 195
WII五合一运动套件H7/10五合一夜光运动
Wii游戏包
我们的价格:$19.99销售:$5.00您节省:75%
域节点列表对象
(
[长度]=>0
)
PHP警告:DOMDocument::saveHTML()希望参数1是DOMNode,即第195行/var/www/html/myscript.PHP中给出的对象
警告:DOMDocument::saveHTML()希望参数1是DOMNode,即第195行/var/www/html/myscript.php中给出的对象
您的XPath表达式
//表[*[self::tbody或self::thead或self::tfoot]/tr[count(*)=2]]
选择所有表
具有tbody
、thead
或tfoot
子节点(仅其中一个)且tr
子节点正好有两个子节点。由于示例HTML中的表与表达式不匹配,因此会得到一个空的DOMNodeList
。它不匹配,因为table
元素没有列出的子元素(tbody
、thead
或tfoot
)
在对这个问题的评论中,我发现您正试图获取正好有两列的所有表。可以使用以下XPath表达式执行此操作:
//表[(.| tbody | thead | tfoot)/tr[count(td)=2]]
标记
t正文
、thead
和tfoot
是可选的,因为在OR'd元素序列中包含了对表标记(
)的引用。count
函数只选择td
元素。您的XPath选择所有表
都有(tbody
,或thead
,或tfoot
)子元素和tr
每个子节点都有两个子节点。由于示例HTML与条件不匹配,因此会得到一个空的DOMNodeList
。不太清楚你在问什么,或者你想做什么。@RuslanOsmanovtbody
,thead
和tfoot
是可选的,不是吗?至少其中一个必须在那里以匹配表达式啊,好的。我要做的是找到所有表中正好有2个col(),但由于有些表有tbody等,我添加了一个条件。//table[(.| tbody | thead | tfoot)/tr[count(*)=2]
?