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

Php 如果有多个根节点,libxml将解析所有内容,php,libxml2,Php,Libxml2,我知道。它不是有效的XML 不幸的是,这是解决利用libxml的php源代码中的一个bug的一部分 Php loadHTML函数会意外地覆盖无警告和无错误标志,因此如果您传递这些选项,它们将永远不会传递到libxml Php的loadXML不会犯同样的错误。所有标志都按预期工作。因此,我正在研究使用loadXML作为现在的替代品。不幸的是,loadXML不适合加载模板片段或小部件,因为它会在单个根节点之后停止解析。比如说 <!--My title snippet --> <

我知道。它不是有效的XML

不幸的是,这是解决利用libxml的php源代码中的一个bug的一部分

Php loadHTML函数会意外地覆盖无警告和无错误标志,因此如果您传递这些选项,它们将永远不会传递到libxml

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

 <!--My title snippet -->
 <h1>${{ title }}</h1>
 <h4>${{ subtitle }}</h4>
将仅部分加载loadXML。是否有任何选项标志可以强制libxml的解析器继续运行?或者我需要将所有代码片段包装在根节点中吗

我已经探索了其他绕过这个bug的方法。例如,通过使用LIBXML\u USE\u INTERNAL\u ERRORStrue或通过捕获并清除带有输出缓冲区的警告。两者都能工作,但都不令人满意,因为它们将警告和错误写入内存,而我不希望这样

相应的libxml2函数为。我能找到的唯一一个PHP API间接公开此函数的地方是


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

libxml\u use\u internal\u错误有什么问题?警告和错误可以用libxml_clear_errors清除。当然,其他解析选项在appendXML上不可用,我想这对每个人来说都是不可能的。只需等待php补丁完全发布即可。。
$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendXML('<h1>H1</h1><h4>H4</h4>');
print $doc->saveXML($fragment);