【发布时间】:2021-05-17 07:45:20
【问题描述】:
考虑以下代码:
$xmlstr = new DOMDocument();
$xmlstr->loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
$xp = new DOMXPath($xmlstr);
$xp->registerNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
$contents = $xp->query("//w:p");
foreach ($contents as $node)
{
$children = $node->childNodes;
}
这适用于数百个节点,然后突然:
Fatal error: Uncaught Error: Couldn't fetch DOMElement. Node no longer exists
此错误是在以下行中生成的:
$children = $node->childNodes;
如您所见,没有任何处理:foreach $contents as $node 只能在 $node 存在的情况下给出 $node,但是在 PHP 大喊它存在之后 $node 突然不存在。这是不可能的。这是怎么回事?
预先检查节点是否有子节点,甚至检查 (if ($node) 没有改变任何东西。试图捕捉也没有改变任何东西:
try {
$children = $node->childNodes;
}
catch (Exception $e)
{
echo 'Okay, that didn't work<br>';
}
仍然会产生同样的错误。错误未被捕获。
当我在实际对节点执行任何操作之前执行 print_r 时,它会说: DOM 元素 ( ) IE。节点无效。
我已经接近了一点。该节点消失,因为前一个节点中的文本被错误地修改。如果我修改除节点号 195 之外的所有节点,则读取节点 196 时不会出错。如果我也修改节点号 195,节点 196 会突然消失。节点 195 的长度超过 118.000 个字符。我想知道是否有某种限制?如果我将其内容导出到文件中,字符串不会被截断,所以我想知道 $node->textContent 是否有限制?
【问题讨论】:
-
DOMXPath()期望 DOM 不是字符串! php.net/manual/en/domxpath.construct -
您无法使用
catch (Exception $e)捕获错误异常;为此,您需要catch (Error $e)或catch(Throwable $e)。不仅如此,无法捕获致命错误。 php.net/manual/en/language.errors.php7.php -
@MarkusZeller 道歉,这个名字具有欺骗性。我现在在它前面添加了两行。它不是一个字符串。如前所述,这适用于之前的数百个节点。
-
@ZoliSzabó 好的,这就解释了为什么 catch 不起作用,但仍然不能解决问题。
-
很难在没有看到 DOM 的情况下进行调试。