我正在尝试解析一个看起来像这样的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
类中删除该方法。