[英]How to filter out nodes using libxml2
给定一个 XML 文档和一个 XPath 表达式,我想创建一个新文档,其中包含原始文档的所有节点,但由 XPath 表达式选择的节点除外,有效地给出了一个过滤器的结果。
我的想法是使用xmlXpathEvalExpression()
function,并且对于根文档树中的每个节点,复制该节点,除非该节点与返回的xmlNodeSet
匹配。 但是,libxml2 没有给出关于如何或是否可以测试节点是否相等的提示。
您是否应该比较指向返回集中节点的指针? 或者你应该比较给定的节点名称/命名空间?
如评论中所述,从评估 XPath 表达式返回的节点指针直接指向原始文档中的节点。 [1]因此,您只需在返回的节点集中的每个节点上调用xmlUnlinkNode
即可将其从文档中删除。 然后,在第二步中,在每个节点上调用xmlFreeNode
以释放节点。 在取消链接所有节点之前不要调用xmlFreeNode
很重要。 [2]
[1] 除了从命名空间轴namespace::*
返回的命名空间节点,类型为XML_NAMESPACE_DECL
,但这些很少使用。
[2] 如果您以相反的顺序迭代节点集,它应该可以立即释放每个节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.