ruby 如何在Nokogiri中选择包含具有特定值的另一个标签的标签?

1l5u6lss  于 2022-12-03  发布在  Ruby
关注(0)|答案(1)|浏览(95)

我有一个xml,看起来像这样

<list>
<item>
  <id>1</id>
  <data>123</data>
</item>
<item>
  <id>2</id>
  <data>abc</data>
</item>
</list>

nokogiri中是否有任何内置函数可以让我得到一个具有特定<id><item>
看起来像这样的东西:

require 'nokogiri'

xml = '
<list>
<item>
  <id>1</id>
  <data>123</data>
</item>
<item>
  <id>2</id>
  <data>abc</data>
</item>
</list>
'

data = Nokogiri::XML(xml)

item = data.xpath("//item:contains('id', '2')")

我可以通过item = data.xpath("//item").select {|d| d.xpath("id").text == "1"}来实现,但是有没有内置的方法来实现呢?

7kqas0il

7kqas0il1#

下面的评论我会把它的答案。

item = data.xpath("//id[text() = '2']/parent::node()")

这是一个带有xpath的解决方案。用户可以直接访问所需的内容,而不是遍历项目。如果我在此解决方案上执行benchmark,它显示0.000068,而您的方法item = data.xpath("//item").select {|d| d.xpath("id").text == "1"}得分为0.000121,基本上提高了2倍。
至于Slop,它是一个装饰器,可以让代码看起来更“builtin"、更原生,或者其他什么。首先,您需要改变获取数据的方式:data = Nokogiri::Slop(xml),Slop代替XML。实现所需功能的代码如下:

item = data.list.item.select{|x| x.id.text == '2'}

如您所见,它缺少那些xpath字符串,使用了ruby方法:
Slop装饰器实现了method_missing,这样就可以使用方法来代替CSS或XPath。source: w3cub
是的看起来很酷😎
但是它需要0.000137才能完成,因此与您的解决方案相比,优化方面没有提升。如果您不关心优化,而关心代码的可读性和花哨,那么Slop方法可能是一个不错的解决方案。

相关问题