Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中操作DOM_Php_Symfony_Dom_Xpath - Fatal编程技术网

在PHP中操作DOM

在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();

虽然我在整个项目中一直在使用,但它在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();
  $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
。不太清楚你在问什么,或者你想做什么。@RuslanOsmanov
tbody
thead
tfoot
是可选的,不是吗?至少其中一个必须在那里以匹配表达式啊,好的。我要做的是找到所有表中正好有2个col(),但由于有些表有tbody等,我添加了一个条件。
//table[(.| tbody | thead | tfoot)/tr[count(*)=2]