Memory management libXML:检查节点是否已取消链接并释放

Memory management libXML:检查节点是否已取消链接并释放,memory-management,xpath,libxml2,vala,Memory Management,Xpath,Libxml2,Vala,我正在用libxml2解析一个html文档,并删除一些基于xpath查询的元素。例如,我想删除包含“display:none”的所有元素,包括: 再次之后,每个未链接的节点都会非常慢 谢谢你的帮助:)我建议另一种方法来达到同样的效果。您可以使用更具体的xpath,以便在存在具有style属性的嵌套元素包含“display:none”的情况下,只选择最外层的元素: //*[contains(@style,'display:none')][not(ancestor::*[contains(@sty

我正在用libxml2解析一个html文档,并删除一些基于xpath查询的元素。例如,我想删除包含“display:none”的所有元素,包括:

再次之后,每个未链接的节点都会非常慢


谢谢你的帮助:)

我建议另一种方法来达到同样的效果。您可以使用更具体的xpath,以便在存在具有
style
属性的嵌套元素包含
“display:none”
的情况下,只选择最外层的元素:

//*[contains(@style,'display:none')][not(ancestor::*[contains(@style,'display:none')])]

因此,基本上我可以对我在“stripNode”函数中抛出的每个xpath查询执行
“查询”[不是(祖先::“查询”)]
?确切地说,这就是模式
public static void stripNode(Html.Doc* doc, string xpath)
{
    Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
    Xml.XPath.Object* res = cntx.eval_expression(xpath);

    if(res != null
    && res->type == Xml.XPath.ObjectType.NODESET
    && res->nodesetval != null)
    {
        for(int i = 0; i < res->nodesetval->length(); ++i)
        {
            Xml.Node* node = res->nodesetval->item(i);
            if(node != null)
            {
                node->unlink();
                node->free_list();
            }
        }
    }

    delete res;
}
cntx.eval_expression(xpath);
//*[contains(@style,'display:none')][not(ancestor::*[contains(@style,'display:none')])]