Nokogiri: Slop访问一个名为name的节点



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

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

使用Nokogiri::Slop .

我可以很容易地通过lesson.version访问课程,但我不能访问lesson.name,因为名称在这种情况下指的是节点(课程)的名称。

是否有办法访问子元素

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

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)

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

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

使用元编程做一点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名称的方法。暂时从#instance_eval的范围内的Nokogiri::XML::Node类中删除该方法。

相关内容

  • 没有找到相关文章

最新更新