如果存在多个根节点,libxml将解析所有内容


我知道。它不是有效的XML

不幸的是,这是针对php源代码中使用libxml的错误的解决方案的一部分。

Php-loadHTML函数意外地覆盖了无警告和无错误标志,所以如果您传递这些选项,它们永远不会到达libxml。

Php的loadXML不会犯同样的错误。所有标志均按预期工作。因此,我现在正在考虑使用loadXML作为替代。不幸的是,loadXML不适合加载模板片段或小部件,因为它将在单个根节点之后停止解析。所以。。。。

<!--My title snippet -->
<h1>${{ title }}</h1>
<h4>${{ subtitle }}</h4>

将仅使用loadXML部分加载是否有任何选项标志可以强制libxml的解析器继续运行还是我必须要求所有代码段都封装在根节点中

注意

我已经探索了绕过这个bug的其他方法。例如,通过使用LIBXML_USE_INTERNAL_ERRORS(true)或通过使用输出缓冲区捕获并清除警告。两者都有效,但都不令人满意,因为它们将我不想要的警告和错误写入内存。

相应的libxml2函数是xmlParseBalancedChunkMemory。我唯一能找到的PHP API间接公开此函数的地方是DOMDocumentFragment::appendXML

$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendXML('<h1>H1</h1><h4>H4</h4>');
print $doc->saveXML($fragment);

但是,如果您试图解析HTML,您可能会遇到麻烦。

相关内容

最新更新