2013-09-09 3 views
0

Я написал этот код, который должен быть понятен: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 несколько раз.

Как я могу написать все это короче?

+0

ли вы хотите список диагнозов в МКБ главе/группе? – Matt

+0

Ваш XML-пример недопустим. Пожалуйста, используйте правильные примеры при задании вопросов. –

ответ

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"] 
+0

Возможно, xou может помочь мне с моей новой проблемой: http://stackoverflow.com/questions/18699192/undefined-method-von-for-nilnilclass –

Смежные вопросы