7

私はこの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"/>

私の最初のノードは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

問題は、nogiri が 'von_icd_code' と 'bis_icd_code' を正しい順序で抽出せず、最初にすべての von_icd_code をリストし、次にすべての 'bis_icd_code' をリストすることです。ノードを正しい順序で抽出するにはどうすればよいですか?

そして、私の出力では次のようになります:

<von_icd_code V="A00"/>

この場合、 A00のVのコンテンツのみを取得するにはどうすればよいですか

ありがとう!

4

3 に答える 3

8

Nokogiri のtraverseメソッドを使用できます。これは、すべての XML ノードを再帰的にトラバースします。

例は次のようになります。

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

そして、それは印刷されます

"A00"
"B99"
"A00"
"A09"

Nokogiri::Nodeには、非常に複雑な XML ファイルでも非常に優れた処理を実行できる優れた機能が多数あります。それらの短いリストについては、このチート シートをご覧ください。

幸運を!

于 2013-08-10T08:47:12.897 に答える
5

bis_icd_codeeach に続くので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
于 2013-08-10T11:54:28.427 に答える