Nokogiri下一个要素

时间:2013-09-09 12:25:29

标签: ruby nokogiri

我写了这段代码,应该是自我解释:

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

如何将整个事情写得更短?

1 个答案:

答案 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"]