我有一个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"}
来实现,但是有没有内置的方法来实现呢?
1条答案
按热度按时间7kqas0il1#
下面的评论我会把它的答案。
这是一个带有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。实现所需功能的代码如下:如您所见,它缺少那些xpath字符串,使用了ruby方法:
Slop装饰器实现了method_missing,这样就可以使用方法来代替CSS或XPath。source: w3cub
是的看起来很酷😎
但是它需要0.000137才能完成,因此与您的解决方案相比,优化方面没有提升。如果您不关心优化,而关心代码的可读性和花哨,那么
Slop
方法可能是一个不错的解决方案。