Nokogiri每个节点都做,Ruby

Joh*_*ith 7 ruby nokogiri

我有这个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>
              <icd_code V="A00.-"/>
              <bezeichnung V="Cholera"/>
              <abrechenbar V="n"/>
              <krankheit_in_mitteleuropa_sehr_selten V="j"/>
              <schlüsselnummer_mit_inhalt_belegt V="j"/>
              <infektionsschutzgesetz_meldepflicht V="j"/>
              <infektionsschutzgesetz_abrechnungsbesonderheit V="j"/>
Run Code Online (Sandbox Code Playgroud)

你如何看到我的第一个节点是kapitel.我想做像kapitel .each do | f | 这样的事情 因此nokgiri以正确的顺序提取节点von_icd_code和bis_icd_code.我的代码:

    require 'rubygems'
    require 'nokogiri'   
    require 'open-uri'

 @doc = Nokogiri::XML(File.open("icd.xml"))

  kapitel = @doc.css('kapitel')
   kapitel.each do |f|
    puts f.css('von_icd_code')  
    puts f.css('bis_icd_code')  
   end
Run Code Online (Sandbox Code Playgroud)

问题是nogiri没有在右边的oder中提供'von_icd_code'和'bis_icd_code',而是首先列出所有的von_icd_code,然后是所有'bis_icd_code'.我怎样才能在正确的奥得河上提供节点?

在我的输出中,我得到:

<von_icd_code V="A00"/>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我怎样才能获得V的内容A00

谢谢!

Iva*_*rea 7

您可以使用Nokogiri的traverse方法,它以递归的方式遍历所有XML节点.

您的示例将与此类似:

names = %w(von_icd_code bis_icd_code)
@doc.traverse {|node| p node['V'] if names.include? node.name}
Run Code Online (Sandbox Code Playgroud)

它打印出来

"A00"
"B99"
"A00"
"A09"
Run Code Online (Sandbox Code Playgroud)

有很多巧妙的东西Nokogiri::Node可以让我们用最复杂的XML文件做很酷的事情.有关它们的简短列表,您可以查看此备忘单.

祝好运!


pgu*_*rio 5

bis_icd_code以下开始von_icd_code,显而易见的选择是css的+下一个相邻兄弟选择器:

doc.css('von_icd_code').each do |icd|
  puts icd['V']
  puts icd.at('+ bis_icd_code')['V']
end
#=> A00
#=> B99
#=> A00
#=> A09
Run Code Online (Sandbox Code Playgroud)