如何使用 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] 如果以相反的顺序迭代节点集,应该可以立即释放每个节点。
给定一个 XML 文档和一个 XPath 表达式,我想创建一个新文档,其中包含原始文档 的所有节点,但 由 XPath 表达式选择的节点,有效地给出减法过滤器的结果。
我的想法是使用 xmlXpathEvalExpression()
函数,对于根文档树中的每个节点,复制该节点,除非该节点与返回的 xmlNodeSet
匹配。但是,libxml2 没有给出有关如何或是否可以测试节点是否相等的提示。
你应该比较指向返回集合中节点的指针吗?或者你应该比较给定的节点 names/namespaces?
如评论中所述,从计算 XPath 表达式返回的节点指针直接指向原始文档中的节点。[1] 因此您可以简单地调用 xmlUnlinkNode
在返回的节点集中的每个节点上将其从文档中删除。然后,在第二步中,在每个节点上调用 xmlFreeNode
以释放节点。在所有节点取消链接之前不要调用 xmlFreeNode
很重要。[2]
[1] 除了从名称空间轴 namespace::*
返回类型为 XML_NAMESPACE_DECL
的名称空间节点外,这些节点很少使用。
[2] 如果以相反的顺序迭代节点集,应该可以立即释放每个节点。