【问题标题】:How to filter out nodes using libxml2如何使用 libxml2 过滤掉节点
【发布时间】:2021-03-04 16:56:29
【问题描述】:

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

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

您是否应该比较指向返回集中节点的指针?还是应该比较给定的节点名称/命名空间?

【问题讨论】:

  • AFAIK,XPath 结果集中的节点指针指向查询的 XML 文档的原始节点。所以你应该能够进行简单的指针比较。
  • 这就是我一直在想的,但是文档中没有任何关于它的内容,也没有人直接说过,所以我担心我会使用一些可能会改变的实现细节未来。
  • XPath 旨在用于搜索文档,因此结果集指向节点的 副本 是没有意义的,这只会被浪费开销,而是指向 original 节点。我认为这种情况不会随时改变。

标签: c++ xml xpath libxml2


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多