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

时间:2017-01-27 04:22:26

标签: php libxml2

我知道。它不是有效的XML。

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

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

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

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

只会部分加载loadXML。 是否有任何选项标志可以强制libxml的解析器继续运行? 或者我将不得不要求所有代码段都包含在内根节点?

注意

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

1 个答案:

答案 0 :(得分:1)

相应的 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,那么你可能会遇到麻烦。