2013-08-10 10 views
6

मैं इस xml है:Nokogiri प्रत्येक नोड करते हैं, रूबी

<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"/> 

आप कैसे देख सकते मेरा पहला नोड अध्याय है। मैं कुछ ऐसा करना चाहता हूं जैसे कैपिटल। प्रत्येक डू | एफ | ताकि nokgiri सही क्रम में vodes_icd_code और bis_icd_code nodes extrakts। मेरे कोड:

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' Extrakt नहीं करता है बजाय पहले यह सब von_icd_code और तब सभी 'bis_icd_code' की सूची है। मैं दाईं ओर नोड्स को कैसे निकाल सकता हूं?

और मेरे उत्पादन में मैं मिलता है:

<von_icd_code V="A00"/> 

कैसे मैं केवल इस मामले में वी की सामग्री प्राप्त कर सकते हैं A00

धन्यवाद!

उत्तर

5

लेखन के बाद से bis_icd_code प्रत्येक von_icd_code इस प्रकार से traverse का अपव्यय के बिना इसे ठीक कर सकते हैं, स्पष्ट पसंद है सीएसएस का + अगले आसन्न भाई चयनकर्ता:

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

यह जोड़ों में * von_icd_code' के बाद * bis_icd_code' हमेशा दिखाई देता है * पर निर्भर करता है। वे ऐसा कर सकते हैं लेकिन इसका कोई सबूत नहीं है। – Borodin

+0

बेशक इसके सबूत हैं। उदाहरण देखो। – pguardiario

5

आप नोकोगिरी की traverse विधि का उपयोग कर सकते हैं, जो अच्छी तरह से, सभी एक्सएमएल नोड्स को एक पुनरावर्ती फैशन में घुमाता है।

आपका उदाहरण तो कुछ ऐसा दिखाई देगा:

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 जो हमें भी साथ बहुत अच्छा कार्य कर सकते हैं में साफ बहुत कुछ है सबसे जटिल एक्सएमएल फाइलें। उनमें से एक छोटी सूची के लिए, आप at this cheat sheet देख सकते हैं।

शुभकामनाएं!

+0

धन्यवाद, आप कुछ idee मैं कैसे मेरी पहली मुद्दे को हल कर सकता है, ताकि नोड्स सही ओडर में दिखाई पड़ता है? –

+1

वे पहले से ही करते हैं, अगर हम 'पी नोड [' वी ']' से 'p node.name' से कोड बदलते हैं, तो हमारे पास सही क्रम में नोड्स होंगे। –

+0

क्षमा करें, लेकिन मुझे आउटपुट टेक्स्ट टेक्स्ट icd_code ... मिलता है! मेरा कोड: नाम =% डब्ल्यू (von_icd_code bis_icd_code) @ doc.traverse {| node | पी नोड ['वी'] अगर नाम.in शामिल हैं? node.name} –

2

अद्यतन

मैं माफी चाहता हूँ, इस CSS चयनकर्ताओं के साथ काम नहीं करता। इसके बजाए XPath का प्रयोग करें। और आपके माध्यमिक प्रश्न के लिए,एक नोड node की विशेषता node['V'] का उपयोग करके नोकोगिरी में उपयोग की जा सकती है। इस

kapitel = @doc.xpath('//kapitel') 
kapitel.each do |f| 
    f.xpath('//von_icd_code | //bis_icd_code').each do |node| 
    puts node['V'] 
    end 
end 

उत्पादन की तरह

A00 
B99 
A00 
A09 

आप

kapitel.each do |f| 
    puts f.css('von_icd_code, bis_icd_code') 
end 
+0

आप कहते हैं कि यह सीएसएस चयनकर्ताओं के साथ काम नहीं करता है, तो आप दिखाते हैं कि यह करता है। एक पक्ष चुना। – pguardiario

+0

@ पगार्डियारियो: XPath का उपयोग करके अपडेट ठीक काम करता है। मूल, जो सीएसएस का उपयोग करता है, सभी 'von_icd_code' तत्वों के माध्यम से और फिर' bis_ice_code' तत्वों के माध्यम से पुनरावृत्त करता है। – Borodin

संबंधित मुद्दे