如何使用 libxml2 过滤掉节点

How to filter out nodes using libxml2

给定一个 XML 文档和一个 XPath 表达式,我想创建一个新文档,其中包含原始文档 的所有节点,但 由 XPath 表达式选择的节点,有效地给出减法过滤器的结果。

我的想法是使用 xmlXpathEvalExpression() 函数,对于根文档树中的每个节点,复制该节点,除非该节点与返回的 xmlNodeSet 匹配。但是,libxml2 没有给出有关如何或是否可以测试节点是否相等的提示。

你应该比较指向返回集合中节点的指针吗?或者你应该比较给定的节点 names/namespaces?

如评论中所述,从计算 XPath 表达式返回的节点指针直接指向原始文档中的节点。[1] 因此您可以简单地调用 xmlUnlinkNode 在返回的节点集中的每个节点上将其从文档中删除。然后,在第二步中,在每个节点上调用 xmlFreeNode 以释放节点。在所有节点取消链接之前不要调用 xmlFreeNode 很重要。[2]

[1] 除了从名称空间轴 namespace::* 返回类型为 XML_NAMESPACE_DECL 的名称空间节点外,这些节点很少使用。

[2] 如果以相反的顺序迭代节点集,应该可以立即释放每个节点。