libxml 如果有多个根节点则解析所有内容

libxml parse all content if there are multiple root nodes

我知道。无效 XML.

不幸的是,它是解决 php 源代码中使用 libxml 的错误的一部分。

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

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

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

只会部分加载 loadXML。 是否有任何选项标志来强制 libxml 的解析器继续运行?或者我必须要求所有片段都包含在根节点中?

备注

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

对应的libxml2函数为xmlParseBalancedChunkMemory. The only place I could find where this function is exposed indirectly by the PHP API is DOMDocumentFragment::appendXML.

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

但如果您尝试解析 HTML,您可能 运行 会遇到麻烦。