使用XPath和libxml2检查祖先的最快方法

时间:2013-08-16 09:24:23

标签: c xml performance xpath libxml2

我正在开发一个使用libxml2处理HTML文档的小型阅读应用程序。在处理HTML树时,我会检查每个text()节点的祖先,以选择合适的样式。对于标头,我使用以下查询来查看节点是否为标头:

boolean(ancestor::*[
self::h1 or 
self::h2 or 
self::h3 or 
self::h4 or 
self::h5 or 
self::h6])

使用5 MB的书,需要1.1秒才能通过。与强调和代码样式的两个额外查询(具有更大的节点名称集)一起,它增加了4.4秒。

根据Apple的仪器,瓶颈线是:

xmlXPathObject *object = xmlXPathNodeEval(node, query, context);

我缓存context以加快速度。还有什么我可以做的让它更快吗?

1 个答案:

答案 0 :(得分:2)

我认为你的XPath表达式对于libxml2来说是最佳的。但似乎您没有预编译XPath查询。如果您在程序开始时使用xmlXPathCompile编译一次查询并使用xmlXPathCompiledEval进行评估,那么您应该会看到显着的加速。

最重要的是,您可以从查询中删除boolean函数并直接调用xmlXPathCompiledEvalToBoolean来获得较小的加速。