2010-05-25 10 views
49

का उपयोग करके विशेषताओं तक पहुंच कैसे प्राप्त करें मेरे पास कुछ विशेषताओं के मानों तक पहुंचने का एक आसान कार्य है। नीचे एक साधारण स्क्रिप्ट है जो एक साधारण एक्सएमएल दस्तावेज़ बनाने के लिए Nokogiri::XML::Builder का उपयोग करती है।नोकोगिरी

require 'nokogiri' 

builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml| 
    xml.Placement(:messageId => "392847-039820-938777", :system => "MOD", :version => "2.0") { 
    xml.objects { 
     xml.object(:myattribute => "99", :anotherattrib => "333") 
     xml.nextobject_ '9387toot' 
     xml.Entertainment "Last Man Standing" 
    } 
    } 
end 

puts builder.to_xml 
puts builder.root.attributes["messageId"] 

परिणाम में नीचे हैं:

<?xml version="1.0" encoding="UTF-8"?> 
<Placement messageId="392847-039820-938777" version="2.0" system="MOD"> 
    <objects> 
    <object anotherattrib="333" myattribute="99"/> 
    <nextobject>9387toot</nextobject> 
    <Entertainment>Last Man Standing</Entertainment> 
    </objects> 
</Placement> 
C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/document.rb:178:in `add_child': Document already has a root node (RuntimeError) 
    from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/node.rb:455:in `parent=' 
    from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/builder.rb:358:in `insert' 
    from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/builder.rb:350:in `method_missing' 
    from C:/Documents and Settings/etrojan/workspace/Lads/tryXPATH2.rb:15 

एक्सएमएल कि उत्पन्न होता है ठीक लग रहा है। हालांकि, पहुँच गुण करने के लिए अपने प्रयास में कोई त्रुटि

Document already has a root node 

मुझे समझ नहीं आता क्यों एक पुट बयान यह त्रुटि उत्पन्न होगी उत्पन्न किया जा करने के लिए कारण। किसी भी सुझाव के लिए बहुत आभार होगा।

उत्तर

57

Nokogiri::XML::Reader का उपयोग आपके उदाहरण के लिए काम करता है, लेकिन शायद वह पूरा उत्तर नहीं है जिसे आप ढूंढ रहे हैं (ध्यान दें कि no attributes method for Builder है)।

reader = Nokogiri::XML::Reader(builder.to_xml) 
reader.read #Moves to next node in document 
reader.attribute("messageId") 

ध्यान दें कि अगर आप reader.read फिर से जारी किए गए और उसके बाद reader.attribute("messageId") की कोशिश की परिणाम nil हो जाएगा के बाद से वर्तमान नोड यह विशेषता नहीं होगा।

यदि आप शायद एक एक्सएमएल दस्तावेज खोजना चाहते हैं तो Nokogiri::XML::Document का उपयोग करना चाहते हैं। (यह मानते हुए आप पहले से ही अपने xml, एक चर xml कहा जाता है में संग्रहीत की गई @atomicules 'जवाब के अंतर्गत आने वाले)

doc = Nokogiri::XML(builder.to_xml) 
elems = doc.xpath("//*[@messageId]") #get all elements with an attribute of 'messageId' 
elems[0].attr('messageId') #gets value of attribute of first elem 
+4

महान सामान , इससे मुझे सप्ताहांत कोडफेस्ट के दौरान 2:22 बजे बाहर निकलने में मदद मिली। ग्रेसियस। –

+0

मैंने इस कोड को http://www.dzone.com/snippets/finding-elements-attributes देखा और मेरा सिर तोड़ रहा था क्योंकि मैं @ बाहरी [का उपयोग कर रहा था। यह एक असली उद्धारक रहा है। मैंने एक्सएमएल विशेषताओं को पार्स करने के लिए एक तरीका जानने के लिए 2 दिन बर्बाद कर दिए हैं और यह एक सच्चा उद्धारक है। यह अच्छा होगा अगर यह लिंक नोकोगिरी –

+0

में जोड़ा गया है तो आप विशेषता मूल्य 'nokogiri_element.xpath ("@ id") प्राप्त करने के लिए xpath का उपयोग कर सकते हैं। टेक्स्ट() ' – stopanko

38

यहाँ Nokogiri का उपयोग कर विशेषताओं का उपयोग करने के साथ ही कुछ अधिक संक्षिप्त तरीका है:

xml.xpath("//Placement").attr("messageId") 
संबंधित मुद्दे