我正在尝试解析一个看起来像这样的xml:
<lesson>
<name>toto</name>
<version>42</version>
</lesson>
使用Nokogiri::Slop
。
我可以通过lesson.version
轻松访问课程,但我无法访问lesson.name
,因为在这种情况下,名称是指节点的名称(课程)。
有没有办法接触孩子?
答案 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
中删除该方法。