我写了这段代码,应该是自我解释:
def parse_kapitel(node)
if node.node_name.eql? 'nummer'
tmp_kapitel = Kapitel.new
puts node.next_element['V']
puts node.next_element.next_element['V']
puts node.next_element.next_element.next_element['V']
end
end
我的xml:
<kapitel>
<nummer V="1"/>
<von_icd_code V="A00"/>
<bis_icd_code V="B99"/>
<bezeichnung V="Bestimmte infektiöse und parasitäre Krankheiten"/>
<gruppen_liste>
<gruppe>
<von_icd_code V="A00"/>
<bis_icd_code V="A09"/>
<bezeichnung V="Infektiöse Darmkrankheiten"/>
<diagnosen_liste>
<diagnose>
您可以看到我的代码非常繁琐,因为我多次使用next_element
。
如何将整个事情写得更短?
答案 0 :(得分:2)
这是怎么回事?
require 'nokogiri'
doc = Nokogiri.XML <<-eol
<kapitel>
<nummer V="1"/>
<von_icd_code V="A00"/>
<bis_icd_code V="B99"/>
<bezeichnung V="Bestimmte infektiöse und parasitäre Krankheiten"/>
<gruppen_liste>
<gruppe>
<von_icd_code V="A00"/>
<bis_icd_code V="A09"/>
<bezeichnung V="Infektiöse Darmkrankheiten"/>
</kapitel
eol
doc.xpath("/kapitel//@V").map(&:text)
# => ["1",
# "A00",
# "B99",
# "Bestimmte infektiöse und parasitäre Krankheiten",
# "A00",
# "A09",
# "Infektiöse Darmkrankheiten"]
如果你想要属性V
的前三个兄弟的值,那么做这样的事情:
doc.xpath("/kapitel/*[name(.)='nummer']/following-sibling::*")[0..2].map{|n|n["V"]}
# => ["A00", "B99", "Bestimmte infektiöse und parasitäre Krankheiten"]