Xml 在Nokogiri中选择子节点最便宜的方法是什么?

Xml 在Nokogiri中选择子节点最便宜的方法是什么?,xml,ruby,nokogiri,Xml,Ruby,Nokogiri,我知道有几十种方法可以选择Nokogiri中的第一个子元素,但哪种方法最便宜 我不能到处使用Nodechildren,这听起来非常昂贵。如果有10000个子节点,而我不想触碰9999其他节点……您可以自己尝试,并对结果进行基准测试 我创建了一个快速基准: 从我的测试来看,children似乎是最快的方法。一种既不使用XPath也不会解析整个父级的方法是同时使用Nodechild、Nodenext\u sibling和Nodeelement 像这样的 def first(node) ele

我知道有几十种方法可以选择Nokogiri中的第一个子元素,但哪种方法最便宜


我不能到处使用Nodechildren,这听起来非常昂贵。如果有10000个子节点,而我不想触碰9999其他节点……

您可以自己尝试,并对结果进行基准测试

我创建了一个快速基准:


从我的测试来看,children似乎是最快的方法。

一种既不使用XPath也不会解析整个父级的方法是同时使用Nodechild、Nodenext\u sibling和Nodeelement

像这样的

def first(node)
    element = node.child
    while element
       if element.element?
           return element
       else
           element = element.next
       end
    end
    nil
end
Nodechild是获取第一个子元素的最快方法

但是,如果您要查找的节点不是第一个,可能不是第99个,那么没有比调用子节点并索引到其中更快的方法来选择该节点

如果您只需要第一个节点集,那么为所有孩子构建节点集的成本很高,这一点是正确的

一个限制因素是Nokogiri底层的XML库libxml2将节点的子节点存储为链表。因此,您需要遍历上的列表以选择所需的子节点


编写一个方法来简单地返回第n个子对象是可行的,而不必为所有其他子对象实例化节点集甚至Ruby对象。我的建议是向Nokogiri邮件列表发送或发送电子邮件。

您使用的前四种方法使用xpath,速度非常慢。问题中提到的子方法解析整个父节点,这也是不可接受的。用100倍的节点和1/100的测试来尝试它们。谢谢你顺便向我展示了基准库。。。我认为它在未来可能会非常有用:-我不确定这是否告诉我们任何真正有用的东西。使用子节点是可行的,但在现实生活中,尝试通过索引查找节点似乎没有多大帮助,除非确保正确创建文件;对于正常使用,这是一种缓慢而痛苦的方法,它抛弃了使用解析器的价值。将XML作为文本阅读并搜索每一行会更容易。利用使用XPath或CSS的能力,通过逐个节点遍历大型XML或HTML文档,编码时间和总体处理速度将成倍提高。这已经完成了!谢谢:-讨论了这个问题,但是这个想法被拒绝了。讨论很有趣。选择第一个子节点的目的是什么?寻找特定的数据需要在我需要做的每件事中找到方向点和地标。我不知道。这已经是10年前的事了。虽然它可以工作,但它也比使用选择器查找特定节点并从中导航要慢得多。
def first(node)
    element = node.child
    while element
       if element.element?
           return element
       else
           element = element.next
       end
    end
    nil
end