Nokogiri:Slop访问名为name的节点

时间:2014-07-15 09:41:49

标签: ruby nokogiri

我正在尝试解析一个看起来像这样的xml:

<lesson>
  <name>toto</name>
  <version>42</version>
</lesson>

使用Nokogiri::Slop

我可以通过lesson.version轻松访问课程,但我无法访问lesson.name,因为在这种情况下,名称是指节点的名称(课程)。

有没有办法接触孩子?

3 个答案:

答案 0 :(得分:2)

作为一种变体,你可以试试这个:

doc.lesson.elements.select{|el| el.name == "name"}

为什么呢?仅仅因为这个基准:

require 'nokogiri'
require 'benchmark'

str = '<lesson>
  <name>toto</name>
  <version>42</version>
</lesson>'

doc = Nokogiri::Slop(str)

n = 50000
Benchmark.bm do |x|
  x.report("select") { n.times do; doc.lesson.elements.select{|el| el.name == "name"}; end }
  x.report("search") { n.times do; doc.lesson.search('name'); end }
end

这给了我们结果:

#=>           user     system      total        real
#=> select 1.466000   0.047000   1.513000 (  1.528153)
#=> search 2.637000   0.125000   2.762000 (  2.777278)

答案 1 :(得分:1)

您可以使用search并为节点提供xpath或css选择器:

doc.lesson.search('name').first

答案 2 :(得分:1)

使用元编程进行 hack

require 'nokogiri'

doc = Nokogiri::Slop <<-HTML
<lesson>
  <name>toto</name>
  <version>42</version>
</lesson>
HTML


name_val = doc.lesson.instance_eval do
  self.class.send :undef_method, :name
  self.name
end.text
p name_val # => toto
p doc.lesson.version.text # => '42'

Nokogiri::XML::Node#name是一个定义为获取Nokogiri::XML::Node名称的方法。暂时,请从Nokogiri::XML::Node范围内的班级#instance_eval中删除该方法。