0

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

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了好几次。

我怎样才能把整件事写得更短?

4

1 回答 1

1

这怎么样?

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"]
于 2013-09-09T12:30:39.420 回答