2013-05-30 5 views
6

के साथ एक नोड के भाई बहन प्राप्त करना क्या नोड में विशिष्ट मान खोजने का कोई तरीका है और फिर अपने सभी भाई मूल्यों को वापस कर सकते हैं?नोकोगिरी

उदाहरण के लिए, मैं id नोड कि आईडी 5678 में शामिल है लगता है खोजने के लिए और फिर ईमेल पता और आईडी 5678.

Nokogiri::XML.parse(File.open('info.xml')) 

के साथ जुड़े सभी छवियों को यहां एक नमूना एक्सएमएल फ़ाइल है प्राप्त करना चाहते हैं।

<xmlcontainer> 
    <details> 
    <id>1234</id> 
    <email>[email protected]</email> 
    <image>images/1.jpg</image> 
    <image>images/2.jpg</image> 
    <image>images/3.jpg</image> 
    </details> 
    <details> 
    <id>5678</id> 
    <email>[email protected]</email> 
    <image>images/4.jpg</image> 
    <image>images/5.jpg</image> 
    </details> 
    <details> 
    <id>9011</id> 
    <email>[email protected]</email> 
    <image>images/6.jpg</image> 
    <image>images/7.jpg</image> 
    </details> 
</xmlcontainer> 

उत्तर

3
require 'nokogiri' 
doc = Nokogiri::XML.parse(File.open('info.xml')) 
details = doc.css('details').find{|node| node.css('id').text == "5678"} 
email = details.css('email').text # => "[email protected]" 
images = details.css('image').map(&:text) # => ["images/4.jpg", "images/5.jpg"] 

अद्यतन:, छोटे होते हैं, यकीनन बेहतर details नोड आप चाहते हैं हड़पने के लिए तरीके:

details = doc.at('details:has(id[text()="5678"])') 

या

details = doc.search('id[text()="5678"] ~ *') 

उन दोनों के सौजन्य से कर रहे हैं pguardiario।

+1

आप 'select {} 'के साथ' select {}। First' को बदलकर इसे कस कर सकते हैं या आप' doc.at ('विवरण: (id [text() = के साथ विवरण सीधे नोड पर प्राप्त कर सकते हैं। "5678"]) ') ' – pguardiario

+0

@pguardiario दस्तावेज़ खोजने के कई तरीके! सुझावों के लिए धन्यवाद! –

+2

आपका स्वागत है! उस स्थिति में xpath वास्तव में सरल हो सकता है: 'doc.at ('// id [text() =" 5678 "]/..')' – pguardiario

6

आप ~, जो सीएसएस सामान्य भाई चयनकर्ता का उपयोग कर सकते हैं:

doc.search('id[text()="5678"] ~ *').map &:text 
#=> ["[email protected]", "images/4.jpg", "images/5.jpg"] 

यह एक छोटा सा एक्सएमएल साथ सीएसएस का उपयोग करने के अजीब है, लेकिन यह (xpath से) को देखने के लिए इतना आसान है।

+0

बहुत अच्छा वाक्यविन्यास 'आईडी [टेक्स्ट() = "5678"] ~ *' '। पहली बार मैंने मूल रूप से 'XPATH' भाग '[text() = "5678"] 'पाया। आपने ऐसी चाल कहाँ देखी है? :) यदि संभव हो तो खोज अभिव्यक्ति को समझाएं। –

+0

'[text() =" 5678 "]' मानक सीएसएस नहीं है लेकिन नोकोगिरी इसे अनुमति देता है। बाकी सिर्फ सीएसएस है। '~ *' का मतलब है किसी भी भाई तत्व – pguardiario

+0

+1 "यह एक्सएमएल के साथ सीएसएस का उपयोग करने के लिए थोड़ा अजीब है लेकिन यह देखने के लिए बहुत आसान है (xpath से)।" मैं सहमत हूं, और मुझे खुशी है कि नोकोगिरी हमें वह विकल्प देता है। सीएसएस आमतौर पर बहुत अधिक पठनीय है। –

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